Обход границы бинарного дерева против часовой стрелки
Для заданного двоичного дерева выведите граничные узлы двоичного дерева против часовой стрелки, начиная с корня.
Редактировать: в постановке задачи говорится, что граничные элементы двоичного дерева должны быть напечатаны против часовой стрелки, то есть элементы на левой границе дерева, за которыми следуют листовые узлы, за которыми следует элемент на правой границе дерева. В вопросе конкретно упоминается это:"левая граница должна быть напечатана сверху вниз, листовые узлы должны быть напечатаны слева направо, а правая граница напечатана снизу вверх".
Я следовал этому уроку.
Мой код выглядит следующим образом:
void printLeft(struct node* root)
{
if(root==NULL)
return;
if(root->left)
{
printf("%d ", root->data);
printLeft(root->left);
}else if(root->right)
{
printf("%d ", root->data);
printLeft(root->right);
}
}
void printRight(struct node* root)
{
if(root==NULL)
return ;
if(root->right)
{
printRight(root->right);
printf("%d ", root->data);
}else if(root->left)
{
printRight(root->left);
printf("%d ", root->data);
}
}
void printLeaves(struct node* root)
{
if(root==NULL)
return ;
printLeaves(root->left);
if(root->left==NULL&&root->right==NULL)
printf("%d ", root->data);
printLeaves(root->right);
}
void printBoundary(struct node* root)
{
if(root==NULL)
return;
printf("%d ", root->data);
printLeft(root->left);
printLeaves(root);
printRight(root->right);
}
Но упомянутый выше подход имеет фундаментальный недостаток: рассмотрим двоичное дерево
> 10
> / \
> 5 6
> / \
> 7 8
> /
> 4
> /
> 2
Мой код потерпит неудачу. Не могли бы вы помочь мне исправить это.
PS Это не домашнее задание. Я готовлюсь к собеседованию и застрял здесь.