要求不能改变二叉树,而且是非递归的,空间代价是O(1)的。
这个题目是在假设有指向父节点的指针存在的情况下,才可以写的(那一章的二叉树都默认是有三个指针:parent(n),left(n),right(n))
解法:其实可以通过当前节点和已访问节点的关系来决定下一步应该如何进行,比如说:
1, 如果已访问节点是当前访问的节点的父亲,那证明我们刚刚移动到这个节点,我们下一个要访问它的左子孩子;
2, 如果已访问节点是当前访问的节点的左子孩子,那我们就知道当前节点的左孩子,已经被访问,我们继续要访问它的右孩子;
3, 最后,如果已访问节点是当前访问节点的右孩子,那我们就知道当前节点的两个子树均已遍历完毕,下一步直接要访问其父亲节点。
程序如下:
binary_tree_traversal(Node* n)
{
Node* prev;
Node* curr;
Node* next;
while(curr != NULL)
{
if(prev == curr.parent()) // 对应情况1.
{
next=curr.left();
if(next == NULL)
{
cout<<curr.key()+" "<<ends;
next=curr.right();
if(next == NULL)
next=curr.parent();
}
}
else if(prev == curr.left()) // 对应情况2.
{
next=curr.right();
if(next==NULL)
{
cout<<curr.key()+" "<<ends;
next=curr.parent();
}
}
else next=curr.parent(); // 对应情况3.
//更新 curr 和 prev
prev=curr;
curr=next;
}
}
如果是一个一般意义的二叉树呢? 没有指向父节点指针parent的情况。大家可以讨论一下,欢迎给我留言~
http://blog.163.com/kevinlee_2010/
浙公网安备 33010602011771号