首页 > 其他分享 >LeetCode 144 94 145 关于前中后序遍历二叉树的思考(包含迭代法)

LeetCode 144 94 145 关于前中后序遍历二叉树的思考(包含迭代法)

时间:2022-10-17 17:55:45浏览次数:80  
标签:node 144 遍历 递归 前序 二叉树 迭代法 stack append

用系统堆栈实现(递归)

很容易实现:

  1. 前序:do(), 递归左儿子, 递归右儿子
  2. 中序:递归左儿子, do(), 递归右儿子
  3. 后序:递归左儿子, 递归右儿子, do()

用自定义栈实现(迭代法)

首先首先首先!!!
明确前中后序遍历的本质,即二叉树节点的访问顺序:

  1. 前序:中 -> 左 -> 右
  2. 中序:左 -> 中 -> 右
  3. 后序:左 -> 右 -> 中

中代表直接访问了一次该节点,左右代表访问一次其左右儿子


随想录链接:https://programmercarl.com/二叉树的迭代遍历.html#前序遍历-迭代法

前序的写法:

模拟递归法即可,唯一需要注意点就是,因为用的自己的栈,故如果想先左后右,那么必须先入栈右儿子

点击查看代码
while len(stack) != 0:
    res.append(stack[-1].val)
    node = stack.pop()
    if node.right:
       stack.append(node.right)
    if node.left:
       stack.append(node.left)

中序的写法:

我最开始思路就是,不就是再模拟一次递归就好?故调整左右儿子入栈顺序。太天真了
其实前序遍历写法简单的关键在访问与处理刚好都是第一步,而中序是第二次访问才开始处理
故应该分步负责访问和处理

  1. 用一个指针负责访问
  2. 用栈维护处理节点的功能
p = root
while p or stack:
    if p:
        stack.append(p)
        p = p.left
    else:
        p = stack.pop()
        res.append(p.val)
        p = p.right

后序的写法:

这个是完全学习的随想录,实在没思路了。

先序遍历是中左右,后续遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图:
image

故调整下前序法的顺序(注意先右后左):

while len(stack) != 0:
    res.append(stack[-1].val)
    node = stack.pop()
    if node.left:
        stack.append(node.left)
    if node.right:
        stack.append(node.right)

最后来个res.reverse()

标签:node,144,遍历,递归,前序,二叉树,迭代法,stack,append
From: https://www.cnblogs.com/Linanjing/p/16799908.html

相关文章

  • 理解二叉树的四种遍历-前序、中序、后序、层序
    理解二叉树的四种遍历-前序、中序、后序、层序一、易懂的形象理解其实从名字就可以很好的理解这三种遍历,我在第二点时候说,但是估计能翻到我的文的同学们之前肯定看过好多......
  • 105. 从前序与中序遍历序列构造二叉树
    题目描述给定两个整数数组 preorder和inorder ,其中 preorder是二叉树的先序遍历,inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。输入:preorder=[......
  • C++二叉树动画演示
    C++二叉树动画演示题目2:基于前序、中序、后序序列构造二叉树需求:1、任意输入前序+中序序列或者中序+后序序列,生成二叉树,请使用三叉链表,在构造链表的过程中同步更新每......
  • 【数据结构】二叉树的概念和简单实现(仅供学习交流使用)
    1、树1、树的概念   树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝......
  • 给你一个二叉树的根节点 root , 检查它是否轴对称。
    用两个指针去遍历这棵树,(并使用深度优先中序遍历方法)一个指针从左方向开始遍历,一个指针从右方向开始遍历。比较结构与数据#Definitionforabinarytreenode.#class......
  • #yyds干货盘点# LeetCode 热题 HOT 100:二叉树的中序遍历
    题目:给定一个二叉树的根节点root,返回它的中序 遍历。 示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]代码实现:cla......
  • 1441. 用栈操作构建数组
    本题非常简单,一个简单的模拟题解题思路:如果两个相邻数字相差不为1,那么对两个数字的差值减1进行“Push”和“Pop”如果两个相邻数字相差不1,那么直接“Push”即可......
  • 654. 最大二叉树
    题目描述给定一个不重复的整数数组 nums。 最大二叉树 可以用下面的算法从 nums递归地构建:创建一个根节点,其值为 nums中的最大值。递归地在最大值 左边 的 ......
  • 层序遍历递归删除二叉树
    层序遍历递归删除二叉树什么是递归删除?从叶节点开始向根节点的方向逐层删除。直观的讲,对于以下二叉树,递归删除的次序为:f->g->h->i->d->e->b->c->a递......
  • 树与二叉树
    二叉树性质:度为0的节点比度为2的节点多一个。解释:度为1的节点均可忽略;度为2的节点就相当于分割点,而度为0的节点就相当于线段;不分割时即有一条线段,当每多一个分割点时,线段......