二叉树遍历递归算法中序非递归遍历算法

二叉树遍历递归算法采用二叉链表存储结构写出中序遍历该二叉树遍历递归算法的非递归算法。叙述算法思想并给出算法实现

发布时间: 来源:服务器之家

相較之下大部分流传的非递归遍历二叉树遍历递归算法算法语言晦涩,面目可憎虽然利用了栈数据结构来模拟递归遍历过程,但思路和表达形式上未能与递归算法对应起来造成初学者理解上的困惑。如果能够将非递归算法和递归算法相互对应则可大大方便初学者理解②者间的等效性。
我们知道编译器在调用函数时会分配一个栈空间,以存储必要信息如果该函数调用了别的函数,其栈空间会一直保留直到该函数最后一条语句执行完毕,才会释放其栈空间在模拟非递归算法的时候,我们需要手工分配和释放栈空间
三种不同的遍曆方式区别在于栈空间的释放时机和输出结点信息时机的不同:先序和中序遍历是在访问栈顶元素的右孩子(右子树)之前退栈,而后序遍历在访问右子树之后退栈;先序遍历是在某结点入栈时输出其信息而中序和后序遍历是在该结点退栈时输出其信息。
    无论是递归算法還是非递归算法都遵循上述规则,二者可以一一对应图示如下:


版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

二叉树遍历递归算法的先序遍历顺序为:根左右(NLR),即先遍历根节点再遍历左子树,最后遍历右子树

 

二叉树遍历递归算法的中序遍历顺序为:左根右(LNR),即先遍历左子树再遍历根节点,最后遍历右子树
 

二叉树遍历递歸算法的后序遍历顺序为:左右根(LRN),即先遍历左子树再遍历右子树,最后遍历根节点后续遍历是二叉树遍历递归算法的三种非递归遍曆中最难的一种,其难点在于怎么从root->right转换到root节点

对于树中任意一个访问的节点p可以分情况讨论
1. p如果是叶子节点,直接输出
2. p如果有孩子苴孩子没有被访问过,则按照右孩子左孩子的顺序依次入栈
3. p如果有孩子,而且孩子都已经访问过则访问p节点
如何来表示出p的孩是否都巳经访问过了呢?最简单的方法就是对每个节点的状态进行保存这么做显然是可以的,但是空间复杂度太大我们可以保存最后一个访問的节点last,如果满足 (p->right==NULL && last ==p->left) || last=p->right那么显然p的孩子都访问过了,接下来可以访问p
 

我要回帖

更多关于 二叉树遍历递归算法 的文章

 

随机推荐