leetcode每天一题:【二叉树的后序遍历】(简单)

284 阅读2分钟

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

题目描述

leetcode题目地址

给你一个二叉树,需要你返回这个二叉树的后序遍历的节点的val,以数组的形式返回。

再画个图来解释下,哈哈哈

image.png

这个二叉树的后序遍历返回的节点是:

4 -> 5 -> 2 -> 8 > 6 -> 9 -> 7 -> 3 -> 1

思路分析

之前写过中序遍历,和 前序遍历,今天再来看看后序遍历。

中序遍历:遍历从最左边树开始,然后到节点,然后到右边树,一直重复这个流程,直至遍历到最右边的右边树。

前序遍历:遍历从根节点开始,然后到子节点,然后到子节点的左边树,然后到右边树,一直重复这个流程,直至遍历到最右边的右边树。

后序遍历遍历从最左边树开始,然后到右边树,最后才到左边树,一直重复这个流程,直至遍历到根节点。

第一种方法(递归)

这个是使用递归方法,定义一个res数组,存储后序遍历的节点的值。

先遍历节点的左边树,递归遍历,把val push到数组res

接着递归遍历节点的右边树,把val push到数组res

最后才把当前的节点的val push到数组res中。

这样子遍历结束后,res存储的就是后序遍历的节点val

返回res即可。

代码如下:

/**
 * 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) {
    const res = []
    function postorder (root) {
      if(!root) return 
      postorder(root.left)
      postorder(root.right)
      res.push(root.val)
    }
    postorder(root)
    return res
};

image.png

第二种方法(迭代)

迭代法是通过while循环实现的。

定义一个res数组,返回后序遍历的节点的val,一个stack数组,代表入栈的节点。

首先是从节点遍历,然后把它的val unshift到数组的开头。

把它push到stack中,入栈。

然后接着遍历节点的右边树,并且把它们的val unshift到数组的开头。

当右边树为null的时候,然后把节点从stack中出栈,继续遍历它左边树,把左边树的val unshift到数组的开头。

继续遍历,重复上面的步骤。

当stack为空的时候,并且当前没有节点的时候,代表已经遍历完成。

这时候数组的顺序就是左边树 -> 右边树 -> 节点,也就是后序遍历的顺序。

返回res数组即可。

代码如下:

/**
 * 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) {
  const res = []
  const stack = []
  while (root || stack.length) {
    while (root) {
      stack.push(root)
      res.unshift(root.val)
      root = root.right
    }
    root = stack.pop()
    root = root.left
  }
  return res
};

image.png