1.访问完b的左子树后,回到b,此时不能访问b
2.访问完b的右子树后,回到b,此时访问b,访问完b之后,将b归空,只要b被访问,说明它的左右子树已经访问结束,不需要再用了。如果没有右子树,直接访问b。
那么,如何判断上面两种情况?
第一:每个节点添加isfirst标记,初始化为true,表示第一次出现在栈顶,也就是第一种情况,此时需要获取右子,而不是访问。
第二:添加一个指针指向上一个访问的节点。如果右子等于上一个访问的节点,或者右子为空,那么直接访问b,否则,右子入栈。
三种非递归方式都有下面这个模板,要牢牢把握
while ( !s.empty()||p != NULL )
{
if (p)
{
&nbs