[路飞] 30——leetcode - [145] 二叉树的后序遍历

120 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

145. 二叉树的后序遍历

题目分析

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

思路讲解

后序遍历方式为:左右中

后续遍历我们可以不断的访问树的左节点

  • 找出当前节点最左边的节点然后输出
  • 在去找当前节点的父节点的右节点直到找到最右边的节点然后输出
  • 最后输出父节点 直到将整个树遍历完成。

遍历树有两种方法:

  • 递归法:调用方法不断地访问当前节点的左节点直到左节点没有左子节点,再调用递归方法去访问当前节点的右节点,直到没有右子节点,最后在输出当前节点
  • 迭代法:迭代的方法就是进行反向的进行后续遍历——中右左, 然后将遍历的值加入到栈中,在通过栈来输出加入到数组中,栈是先进后出的,所有加入到数组的值是前后中,就为前序遍历了

示例

输入: root = [1,null,2,3]
输出: [3,2,1]

输入: root = []
输出: []

输入: root = [1]
输出: [1]

代码

/*
 * @lc app=leetcode.cn id=145 lang=javascript
 *
 * [145] 二叉树的后序遍历
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var postorderTraversal = function (root) {
  // 递归写法
  // let res = new Array()
  // return postorderTraversalNode(root, res)
  // 迭代写法:模拟树 后序遍历:左右中,栈:先进后出,利用栈的特性,逆序的添加进栈
  // 先把中压入栈,然后把右压入栈,然后把左压入栈,输出的时候先输出左,在输出右,最后输出中
  // 前后中:
  // 前
  // 后
  // 中
  let res = []
  if (!root) return res
  let stack = [root]
  while (stack.length) {
    root = stack.pop()
    res.unshift(root.val)
    if (root.left) stack.push(root.left)
    if (root.right) stack.push(root.right)
  }
  return res
};
// 递归写法
var postorderTraversalNode = function (node, res) {
  if (node) {
    postorderTraversalNode(node.left, res)
    postorderTraversalNode(node.right, res)
    res.push(node.val)
  }
  return res
}
// @lc code=end