首页 > 其他分享 >树的非递归前、中、后序遍历

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

时间:2022-08-17 15:55:11浏览次数:53  
标签:遍历 递归 后序 前序 记录 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
From: https://www.cnblogs.com/followers/p/16595509.html

相关文章

  • 2022-8-17 剑指offer-二叉树-递归
    剑指OfferII054.所有大于等于节点的值之和难度中等35收藏分享切换为英文接收动态反馈给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值......
  • 递推递归与排列组合
    递推递归与排列组合说明排列组合排列组合问题在暴力枚举的情况一般有3种情况我们在此记个数为N情况一:打印n个数的全排列:\[N=n!\]情况二:打印n个数中任意m个数......
  • el-checkbox遍历的的时候如何使用
    <template><divclass="checkBox"><templatev-for="itemincheckedCities"><el-checkbox:key="item.id"v-model="item.isCheck"@change=......
  • C#-OpenCvSharp查找遍历轮廓范围内的点
    privateMatGoFindContours(Matmat,stringname,outMat[]countoursMat){countoursMat=null;MatuseLessMat=newMat();MatGray;MatBgr;......
  • .NET性能优化-快速遍历List集合
    简介System.Collections.Generic.List<T>是.NET中的泛型集合类,可以存储任何类型的数据,因为它的便利和丰富的API,在我们平时会广泛的使用到它,可以说是使用最多的集合类。在......
  • 关于递归
    解决递归问题的5个步骤:视频地址:https://www.bilibili.com/video/BV13h411t7nd?spm_id_from=333.337.search-card.all.click&vd_source=1ec33ee093bb10b996d2573550f4722e......
  • python教程:一个 list 使用 for 遍历,边循环边删除的问题
    今天由于要对一个list数据类型写一个循环删除的程序(这是小编第一次对于list操作),但发现一个奇异问题,来,我们来看看代码跟效果:#初始化一个list列表,为了下边的方便比较......
  • mysql-递归查询
    0.背景最近接触到的业务中需要通过mysql查询部门的组织架构层级关系,最一开始的思路是想通过自定义函数来完成,但是查询效率真的是“感人”。又另辟蹊径找到mysql的递归查......
  • python遍历文件夹中所有的文件
    遍历所有文件和文件夹参考:https://blog.csdn.net/caroline_wendy/article/details/120296249获取视频文件时长参考:https://blog.csdn.net/lilongsy/article/details/121......
  • 3.最大子段和之分治递归法(分治)
    题目描述:给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,......