数据结构关于中序遍历二叉树T的非递归算法的一些疑问

2024-11-15 17:21:27
推荐回答(2个)
回答1:

问题1:上面if的条件p为真指什么p为空指针的时候算吗,这个语句最后执行完后在栈顶的指针是指向最后一个左叶子的结点还是最后一个叶子下指向空的指针
------------------------------------------------------------------------------------------------
p为真表示不为空 这个语句执行了以后 p为最后一个左叶子节点
-----------------------------------------------------------------------------------------------
问题2:(通过上边else的两句话 我感觉退栈的应该是栈顶元素应该是指向最后一个叶子的结点吧 )
执行else语句 遍历到最后一个左孩子时候 该左孩子节点也被看作一个普通节点(一个普通节点访问了自己 还要去访问右孩子 想一想中序遍历???)
所以else就是执行上述动作:
{Pop(S,p); if(!Visit(p-->data)) return ERROR;p=p-->rchild;}---> 然后继续执行while语句(因为p=p-->rchild p此时不一定为空 继续while判断)
重复上面的动作 一直到栈为空
-------------------------------------------------------------------------------------
但是a是怎样实现叶子下的空指针没入栈呢?
如果叶子有空指针的话就直接执行else语句了 就不会入栈了

回答2:

问题1:p为真,意思就是不为空。如果是一颗空树,那么p开始的时候,肯定是为NULL(空),就跳过if语句了。语句最后指向的是最后一个叶子下指向空的指针。因为,当倒数第二个p指向的节点,满足if(p),即不为空,那么,完成Push(S,p),p=p->lchild;之后,p肯定就指向空了,回来再进行if(p)判断的时候,就不执行了。
问题2:一定要看清楚,进栈出栈的顺序,我建议你,画一颗树,按照程序的流程,自己过一边。模拟一下栈的过程,就会非常清楚了。
希望我的回答对你有帮助。