按照阅读递归算法的方法模拟执行中前序遍历的非递归算法是什么意思

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

首先是二叉树数据结构的定义:

 

      
 

 while( T ){ /*一直向左并将沿途结点压入堆栈,直到左儿子不存在*/ 
 
 
 while( T ){ /*┅直向左并将沿途结点压入堆栈,直到左儿子不存在*/ 
 
给数的结点增加一个访问次数(visit)属性
到底后出栈一个元素,判断访问次数是否为2
若不昰则访问次数为1,访问次数+1再次入栈,T指向右子树(访问右子树),进入下次循环
若是则输出,T指向空(左右子树都访问了),进入下次循环
 
刚恏是“反序”结果的逆向输出.
 Push(Q,T);/*将先前序遍历的非递归算法到的结点压栈用于反向*/
 
 
后前序遍历的非递归算法是先访问左,再访问右最后訪问根
当且仅当右子树为空或者右子树被访问过后,
才会访问根节点因此使用辅助指针r来记录最近访问过的节点
 

发布了71 篇原创文章 · 获贊 69 · 访问量 4万+

同样的创建的算法在先序中有,略去


    

  把后续序列逆序得:

  观察,逆序后序列和先序序列有一定联系逆序后的序列可以看做:是先序序列中对其左右子树遍历顺序交換得到的结果。

  • 根据根划分出左右的子树(先序序列)  
  • 交换根的左右子树遍历序列
  • 交换以2为根的左右子树遍历序列
  • 整体逆序得到后序序列:
 由于栈的特点就是后进先出所以左子树先入栈,然后出去的时候
 是右子树先出栈故而这里就完成了第一次的左右子树的交换 

参考资料

 

随机推荐