[路飞]_leetcode-145-二叉树的后序遍历

128 阅读2分钟

一、题目描述

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [3,2,1]
复制代码

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

分析1

首先我们用本题所说的很简单的方法,递归完成本题

解题思路如下:

  1. 当根结点为空的时候,递归终止
  2. 递归的处理左子树、右子树,最后将当前结点的值 push 到结果数组

代码如下:

var postorderTraversal = function(root) {
  const res = [];
  function postorder(root){
    if(root === null) return;
    postorder(root.left);
    postorder(root.right);
    res.push(root.val);
  }
  postorder(root);
  return res;
};

分析2

那怎么通过迭代算法完成二叉树的后序遍历呢?

解题思路如下:

  1. 首先初始化一个栈和一个结果数组
  2. 当存在右子树的时候,一直向下找右子树,该过程中将每个结点压入栈中,并将它的值倒序的插入结果数组
  3. 当找到最右边的右子树之后,将压入栈的元素取出,并将root指向它的左子树
  4. 此时如果左子树存在,则左子树的值会被插入到结果数组的头部
  5. 如此一个一个的三元组处理完成,直到根结点,则会进入左子树处理
  6. 这个过程,结点值插入的顺序是 根 右 左
  7. 因为节点的值每次是插入结果数组头部的,所以结果数组值的顺序为左 右 根
  8. 最后返回结果数组即可

代码如下:

var postorderTraversal = function(root) {
  // 初始化栈和结果数组
  const stack =[],
  res = [];

  while (root || stack.length){
    // 一直向下找右子树
    while(root){
      // 将每个节点压入栈中
      stack.push(root);
      // 过程中将每个结点的值倒序的插入结果数组
      res.unshift(root.val);
      root = root.right;
    }
    // 将压入栈的元素取出,并将root指向它的左子树
    // 此时如果左子树存在,则左子树的值会被插入到结果数组的头部
    root = stack.pop().left;
  }
  // 如此一个一个的三元组处理完成,直到根结点,则会进入左子树处理
  // 这个过程,结点值插入的顺序是 根 右 左
  // 因为节点的值每次是插入结果数组头部的,所以结果数组值的顺序为左 右 根
  return res;
};

如果建议欢迎讨论喔....互赞