ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

树的非递归前、中、后序遍历

2022-08-17 16:03:25  阅读:126  来源: 互联网

标签:遍历 递归 后序 前序 记录 root stack


树的递归方法是比较简单的,但是非递归方法确实比较难写和理解的。

首先说下非递归方法的前序遍历:

使用栈来记录所走过的路程,前需遍历是 根节点,左,然后一直左,走到头了,才返回走右,走完右之后还是死命的走左。通过stack记录元素的时候,是需要先记录右边再记录左边,这样弹出的元素就是每次就是最左边的。

 

网上有很多版本的前序、中序遍历和后序遍历的的答案,代码也不相同,逻辑很简单,实现起来就多种多样,本文就展示一个最容易记忆的递归。

 

前序遍历和中序遍历走的路径是一样的,都是先左,左走完了再走右边。  一个是先上后下, 一个是先下后上,先上后下的就先入栈的被记录, 如果是先下后上,自然是出栈的时候开始往上走,此时被记录

但两者记忆路径的方式是不一样的,一个是在入栈的时候记路径

                一个是在出栈的时候记路径

 

if(root!=null){

  stack.add(root);

  root = root.left;

}else{

  // 弹出上一个节点的值

  root = stack.pop();

  // 此时走右边;

  root= root.left

}

代码如下:

 

 

后续遍历技巧:  后续遍历的内容

如果有个树结构是 [1,2,3,4,5,6,7]   其后续遍历就是   :4,5,2,6,7,3,1

               其镜像的前序遍历为 :1,3,7,6,2,5,4

因此我们把一个问题转化为另外一个问题了。

此时我们可以手动写下两种前序遍历:

1. 如上所示:

  经过简单改变变成镜像的前序遍历,先走右边,再走左边

  if(root!=null){

    //进入之前记录进入的数组

    stack.add(root);

    root = root.right;

  }else{

    // 弹出上一个节点的值

    root = stack.pop();

    // 此时走左边;

    root= root.left

  }

  将记录入栈的结果反转就可以了,你用另外一个栈记录也行。

2. 方法:

   这是先序遍历非递归的另外一种写法:

   这种虽然有弹栈的操作,走的路径不一样罢了,是先将右边的入栈,然后再入左边的。  

   

 

   此时稍加改造

  

 

 

说明前序遍历很重要,学会了前序遍历就相当于学会了后序遍历和中序遍历。

 

标签:遍历,递归,后序,前序,记录,root,stack
来源: https://www.cnblogs.com/followers/p/16595509.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有