中根非递归遍历二叉树


在先根非递归中,根入栈后弹出,访问,右孩子与左孩子进栈,顺序很清楚。但是中根非递归与后根非递归中,根入栈后如果弹出不能访问,这是一个困惑的地方。


为了更明晰地,更统一3种非递归设计思路。均可以采用入栈,弹出,左右子树入栈这种基本步骤。每个步骤需要仔细在纸上演示设计。


由于一个节点出栈后还要进栈,该节点再次位于栈顶时,由于出过栈,再次出栈的时候就直接访问,而不要重复检查他的左右子树了。所以,每个节点还有一个标志位:isPulled.如果为true,则说明该节点出过栈。


经过一些例子演示。设计一种中根非递归的解决步骤:


根r入栈s

while(s不空)

{

栈顶head

if(head.isPulled == true)//head是出过栈

head出栈,访问head

else//head没有出过栈

{

head出栈,head.isPulled=ture

//因为中根,根在中间,那么就再次将右子树,根,左子树的顺序入栈。这样在弹出的时候就是左根右的顺序

//首先判断head左右子树是否全null,如果全null,那么访问head

if(head.left==null && head.right==null)

访问head

if(head.right!=null)//右孩子不空进栈

s.enStack(head.right)

if(head.left!=null || head.right!=null)//有孩子,则就重进栈

s.enStack(head)

if(head.left!=null)//左孩子不空进栈

s.enStack(head.left)

}

}

以上步骤的设计,完全是逐步求精、逐步完善的,先主后次,得到的结果。从手工图纸的步骤中得到一般的规律,主要规律,并用代码表示。


代码最后的结果顺序,体现了一种从上到下,精准的逻辑。但是这种准确的逻辑,依靠人脑是不可能从一开始严丝合缝的写下了。这样,最初的设计就体现的非常关键了。


代码中的条件判断,属于次要步骤,在设计好主要步骤后,后加进去进行完善。


例子中,一颗如下所示的二叉树,进行中根非递归遍历的思路:











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值