我只是想知道如何使用while循环遍历二叉树(不是递归完成)。
我有我的树:
typedef struct Node *BSTree;
typedef struct Node {
int key;
BSTree left, right;
} Node;
我只是想知道如何在while循环中访问每个节点。有人可以告诉我吗?我不能把头缠住。
答案 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);
}
}
请注意,左右分支是反向推入的,因此第一个弹出的是左分支。