因为有了中根非递归遍历的步骤,在最初设计的时候,考虑了“左右孩子与根“入栈的顺序。中根入栈的顺序是”右根左“,则后根入栈的顺序则是”根右左“。
通过草稿模拟整个过程,发现后根遍历的步骤与中根遍历的步骤,仅仅在上面所说的入栈顺序上。这就避免了非递归遍历二叉树造成的思路不一致性。
人们总想要一致的步骤去解决同一类型的问题。具体的设计步骤如下:
根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.left!=null || head.right!=null)//有孩子,则就重进栈
s.enStack(head)
if(head.right!=null)//右孩子不空进栈
s.enStack(head.right)
if(head.left!=null)//左孩子不空进栈
s.enStack(head.left)
}
}
看一下类似的最初设计思路: