您的位置:首页 > 其它

中根非递归遍历二叉树

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

为了更明晰地,更统一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)

}

}

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

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

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

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: