二叉树的遍历
来源:互联网 发布:里皮的水平知乎 编辑:程序博客网 时间:2024/05/20 11:23
由于二叉树本身的递归定义性质,所以递归算法的二叉树算法容易实现,也很符合人类的思维。那么采用迭代的方式呢?这是一种模拟栈的方式,采用人工的方法来压栈出栈。严蔚敏的那本绿色书上就一个中序遍历的非递归算法。假设示例的二叉树:
中序的非递归:
递归栈分析:如上图,先一边搜索左子树一边将节点压栈,当遇到null时,则从栈中弹出一个节点,遍历这个节点,因为左子树已经访问了,故将该节点的右子树压栈即可。
示例分析:
1.将左子树一直压栈,直到压入一个null,如上图1所示。
2.pop一次,弹出null,再pop一次,访问该节点并压入该节点的右子树。如上图2。
3.重复1,2即可。
int intransfer(BTree &T ){
InitStack(S);
Push(S,T);
while( !StackEmpty(S) )
{
while( GetTop(S,P) && P ) Push(S,p->lchild);
Pop(S,P); //退null
if ( !StackEmpty(S) )
{
Pop(S,P);
Visit(P);
Push( S,p->rchild);
}
}
}
先序递归:
发现先序的递归栈与中序的递归栈没区别,不过访问顺序有变化,循环访问根并将根压入栈,直到压入一个空的左子树。这是pop两次,将右子树压入栈。重复迭代这个过程。
示例分析:
1.先将左子树访问并压栈,直到压入一个null。如上图1所示。
2.pop一次将null弹出,再pop一次,将该节点的右孩子入栈。如上图2所示。
3.重复1,2过程。
int preorder( BTree &T ){
InitStack(S);
Push(S,T) ;
while ( !StackEmpty(S) )
{
while( GetTop(S,P) && p )
{
Visit(P) ;
Push(S,P->lchild);
}
Pop(S,P); //退null
Pop(S,P);
Push(S,P->rchild);
}
}
后序遍历:由于左子树的优先权要大于右子树,故即使后序遍历,还是要先搜索左子树,遍历完左子树,然后返回看右子树是否遍历,若没有遍历,则不pop栈顶节点,待遍历完右子树就可以pop节点了。然后也是重复迭代这个过程。
示例分析:
1.将左子树压栈,直到压入一个null。
2.pop掉null,在GetTop取栈顶节点,看是否右子树访问完了,若没有则置标志位,并将右子树压栈;若访问完了,则弹出栈顶节点,并访问该节点。
int postorder( BTree &T ){
InitStack(S);
Push(S,T) ;
while ( !StackEmpty(S) )
{
while( GetTop(S,P) && p )
{
Push(S,P->lchild);
}
Pop(S,P) ; //退null
GetTop(S,P); //取栈顶节点
if ( !P->tag ) //右子树还没访问完
{
Push(S,P->rchild);
P->tag = 1 ;
}
else
{
Pop(S,P);
Visit(P);
}
}
}
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 二叉树的遍历
- 单用户模式启动 修改root密码
- VS 2005 Warning 小记
- 用js使得输入框input只能输入数字
- TinyXML初学
- jQuery选择器中含有空格的注意事项
- 二叉树的遍历
- VC调试入门
- 正则表达式
- Linux编程常用的函数
- 伸长的守候
- frameset框架中session失效后怎样重定向到登录页面
- c++ reference counting引用计数原理
- proc文件系统操作实例
- vecter