如何使用while循环遍历二叉树?

时间:2018-10-16 10:21:06

标签: c struct binary-tree

我只是想知道如何使用while循环遍历二叉树(不是递归完成)。

我有我的树:

typedef struct Node *BSTree;
typedef struct Node {
   int  key;
   BSTree left, right;
} Node;

我只是想知道如何在while循环中访问每个节点。有人可以告诉我吗?我不能把头缠住。

2 个答案:

答案 0 :(得分:2)

您需要引用父节点。

如果root!= null,则将root存储在当前目录中。 如果current有一个左孩子,则将current设置为left child。 如果没有左孩子,并且有一个右孩子,则在当前存储右孩子。 如果当前子节点中没有左右子节点,则将当前节点的父节点存储在当前节点中。

如果这样做,最终将陷入无限循环,但是如果将其存储在当前节点之前,并比较当前节点和最后一个节点之间的关系,则可以遍历整个树。

这不是完整的答案,但会有所帮助。

答案 1 :(得分:0)

从已经访问过的分支机构返回时,可以使用堆栈来存储需要访问的父母。伪C ++中用于遍历遍历的一种方法:

void (Node * root)
{
  if (root == NULL) 
    return;

  Stack<Node *> stack;
  stack.push(root); 

  Node * p;
  while (not stack.is_empty())
    {
      p = stack.pop();

      // here you visit p 

      if (p->right != NULL)
        stack.push(p->left);

      if (p->left != NULL)
        stack.push(p->right);
    }
}

请注意,左右分支是反向推入的,因此第一个弹出的是左分支。