首页 > 其他分享 >leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法后序遍历

leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法后序遍历

时间:2024-07-17 17:00:14浏览次数:10  
标签:遍历 后序 res 二叉树 迭代法 root 节点

leetcode145. 二叉树的后序遍历,递归法+迭代法

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
示例 1:
在这里插入图片描述
输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:
输入:root = []
输出:[]

示例 3:
输入:root = [1]
输出:[1]

递归法还是一如既往的简单。

postorder函数是递归函数,用于辅助实现后序遍历。它接收两个参数:一个指向当前节点的指针root和一个用于存储遍历结果的向量res。函数首先检查当前节点是否为空,如果是,则直接返回。如果不为空,则递归调用自身,先遍历左子树,再遍历右子树。在遍历完左右子树后,将当前节点的值添加到结果向量res中。

postorderTraversal函数是对外提供的公共接口,用于获取二叉树的后序遍历结果。它接收一个参数:一个指向二叉树根节点的指针root。函数首先初始化一个空的结果向量res,然后调用postorder函数进行后序遍历,并将遍历结果存储在res中。遍历完成后,返回这个结果向量。

整个实现过程是典型的递归方法,通过递归调用自身来遍历二叉树的每一个节点。递归的终止条件是当前节点为空,这时函数会返回而不执行任何操作。
在这里插入图片描述

class Solution {
public:
    void postorder(TreeNode *root, vector<int> &res) {
        if (root == nullptr) {
            return;
        }
        postorder(root->left, res);
        postorder(root->right, res);
        res.push_back(root->val);
    }

    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> res;
        postorder(root, res);
        return res;
    }
};

二叉树后序遍历的迭代法相对前序和中序来说就要难一点了,

定义辅助栈:使用一个stack<TreeNode *>类型的栈stk来辅助遍历。

定义前一个访问节点:定义一个TreeNode *类型的指针prev,用来记录上一个被访问的节点。

迭代遍历:使用一个while循环,条件是root不为空或栈stk不为空。这个循环将一直执行,直到所有节点都被访问。

向左下推:内部的第一个while循环将root沿着左子树一直推到最底部,直到遇到空节点。每次迭代,都将当前节点压入栈中,并更新root为当前节点的左子节点。

处理当前节点:当左子树被完全遍历后,root将变为nullptr,此时从栈中弹出栈顶元素,即当前节点。

后序遍历条件判断
如果当前节点的右子节点为空,或者右子节点已经访问过(即root->right == prev),则将当前节点的值添加到结果向量res中,并将prev更新为当前节点,然后将root设置为nullptr,准备处理下一个节点。
如果当前节点的右子节点不为空且未访问过,则将当前节点再次压入栈中,并更新root为当前节点的右子节点,继续遍历右子树。
在这里插入图片描述
1.我们再以这个图为例,首先向左下推直到D,ABD都入栈了,这时候判断D的左子树为null,于是弹出栈顶D,D没有右子树,于是D首先被遍历进结果数组,并将前一个访问节点记录为D,将root变成null,方便处理下一个节点。

2.接下来弹出栈顶元素B,B有右节点且前一个访问节点不是B的右节点,所以把B再推入栈,访问B的右节点F

3.F有左节点,于是F入栈,E入栈,E没有左节点,E出栈。E也没有右节点,于是E第二个被遍历进结果数组,并将前一个访问节点记录为E,将root变成null,方便处理下一个节点。

4.再弹出栈顶元素F,F没有右节点,于是F第三个被遍历进结果数组,并将前一个访问节点记录为F,将root变成null,方便处理下一个节点。

5.再弹出栈顶元素B,B有右节点,但是!!前一个访问节点是B的右节点F,所以B第四个被遍历进结果数组,并将前一个访问节点记录为B,将root变成null,方便处理下一个节点。

依此类推遍历完全部节点DEFBHGICA。
做完此题,二叉树的中序遍历就再简单不过了,可以秒杀。
具体题目如下。

leetcode94二叉树的中序遍历

我也写了二叉树中序遍历的题解,可以去看看。相对二叉树的中序遍历,后序遍历的迭代法确实难了不少,值得反复学习。

标签:遍历,后序,res,二叉树,迭代法,root,节点
From: https://blog.csdn.net/qq_51350957/article/details/140495955

相关文章

  • 利用递归的二叉树的先序,中序,后序遍历
    一.常见的二叉树的遍历①先序遍历:先访问根节点,再访问左右子树(根左右)③中序遍历:先访问左子树,再访问根节点,最后访问右子树(左根右)③后序遍历:先访问左右子树,再访问根节点(左右根)先定义二叉树的数据结构:typedefcharElemType;typedefstructBTNode{ ElemTypedata; ......
  • 不动点迭代法
    不动点迭代(Fixed-pointiteration)(不动点) $x$为单值算子$\mathbb{T}$的不动点,如果$$\mathbb{T}x=x$$ 记$\text{Fix}\mathbb{T}=\{x|x=\mathbb{T}x\}=(\mathbb{I}-\mathbb{T})^{-1}(0)$为单值算子$\mathbb{T}$的不动点集合。 如果单值算子$\mathbb{T}$是非扩张的且$\text{d......
  • java陷阱之遍历数据源数据
    日常我们执行刷数更新避免使用分页偏移,如何涉及到条件变更会丢数据比如满足条件的数据12 34 567根据分页偏移查询当处理第一页12,12处理后不满足条件分页指针偏移到2,这个时候条件12已经不满足了就丢了34数据采用id偏移的方式针对要修改的db场景,还应该避免大事务......
  • 代码随想录算法训练营第十三天 | 144.二叉树的前序遍历、94、二叉树的中序遍历、145、
    144.二叉树的前序遍历题目:.-力扣(LeetCode)思路:有递归法和使用栈来模拟递归的迭代法。代码:1.递归/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nu......
  • Day11(二叉树) | 二叉树的递归遍历 二叉树的迭代遍历 二叉树的统一迭代法 二
    二叉树的递归遍历终于来到了递归!!!递归是进入动态规划的第一步,有部分的递归完全可以写成动态规划!这里可以移步到左程云的视频观看.递归的步骤:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返......
  • 树的遍历
    幻影忍者前情提要这是一棵二叉树,现在,我们要对它进行遍历<( ̄︶ ̄)>前序遍历顺序先根节点,再左节点,再右节点实现如果树为空,返回,否则:访问根节点若根节点有左孩子,前序遍历左子树若根节点有右孩子,前序遍历右子树所以,让我们来实现一下该树的前序遍历:根节点\(1\)->左孩......
  • java List集合转Map并遍历输出
    1.使用流转map并且遍历packagecom.demo.toMap;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;publicclassMianDemo{publicstaticvoidmain(String[]args){List<NodeList>list=......
  • LeetCode 144. 二叉树的前序遍历
    更多题解尽在https://sugar.matrixlab.dev/algorithm每日更新。组队打卡,更多解法等你一起来参与哦!LeetCode144.二叉树的前序遍历,难度中等。classSolution{publicvoidpreorderTraversal(TreeNoderoot,List<Integer>ans){if(root==null)re......
  • Python数据容器(3)--遍历与列表生成式
    文章目录遍历直接遍历索引遍历list列表tuple元组字典遍历get()方法items()方法enumerate()函数与zip()函数enumerate()函数zip()函数列表生成式语法表现形式编写基本的列表生成式带有条件的列表生成式嵌套列表生成式字符串与列表之间的转换总结遍历:列表生成式遍......
  • 树的层次遍历
    树的层次遍历是指按层次顺序访问树中所有节点的遍历方式。具体的步骤如下:从根节点开始,将根节点入队。进行循环,直到队列为空:弹出队列中的节点,并访问该节点。将该节点的所有子节点依次入队。完成遍历。层次遍历的相关知识点:队列:层次遍历需要使用一个队列来暂存节点。每次......