前端算法小白攻略26-leetcode(二叉树的后序遍历)

108 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

前言

从今天起,我们的算法库里就要加入二叉树的题了,先从二叉树的基本遍历开始,二叉树的三种遍历情况是由它根节点读取的位置决定的,前序遍历、中序遍历、后序遍历,今天我们先从后续遍历开始。

题目描述

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历

解题思路

题纲
本题提供一个二叉树的节点数组,让我们用后序遍历的方式来把这些节点放到数组里,后序遍历其实就是先遍历左右子节点,再遍历根节点的一个过程;
举例

image.png
当前二叉树的节点数组为root = [1,null,2,3]
解题规则
这道题最简单的方法就是用递归的思路去正向求解,也可以用逆向迭代的方式求解,我们本题采用递归的方式
递归方式的理解-需要细品
因为我们后序遍历的顺序是左右中,我们可以将整颗二叉树分为左右两个部分,从根节点开始遍历,那肯定是先从左部分树的最深处节点开始,从左部分最深处的左右中一直找到第一个左子节点后,再从右部分树的最深处开始左右中的向上查找,最后一步把我们的根节点找到
以上图为例
遍历root,先找左部分树,发现没有,直接找右部分树,找到最深处根节点2,返回2的左节点3,2的有节点没有,返回2,最后返回根节点1,整个3=》2=》1

开始解题

小技巧

  1. 递归添加函数完毕,从最内层函数开始执行,执行完毕将最内层返回值给到上一层然后执行上一层函数
  2. 无论是找最深处的左节点,还是右节点,它的上一层都属于它两根节点的一层 代码逻辑
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var postorderTraversal = function(root) {
    let res = new Array();  // 初始化数组用来存放我们后序遍历的节点
    return postorderTraversalNode(root,res);  // 从根节点开始调用递归方法
};

var postorderTraversalNode = function(node, res) {
    if(node) {
        postorderTraversalNode(node.left, res);  // 先执行左部分节点的后序push操作,只要node有值就会一直找下去直到最里面的左节点
        postorderTraversalNode(node.right, res); // 完成左部分的后序遍历才会走到这一步,开启右部分的后序遍历
        res.push(node.val);  // 最后这步push根节点
    }
    return res;
}