[路飞]_leetcode_145.二叉树的后序遍历

115 阅读1分钟

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

解题思路

前序遍历排序是 左、右、中 递归方式好处理

迭代方式 我么利用栈来处理后续遍历的排序

1. 首先把二叉树压入栈中
  |       |   |     |
  |       |   |     |
  | root  |   |     |
  |_______|   |_____|
   stack      res

2. 从栈中取出一个二叉树做如下处理
   首先将根节点的值放到遍历栈中
    root
  |       |   |        |
  |       |   |        |
  |       |   |root.val|
  |_______|   |________|
   stack       res

  root = [1,2,3,4,5,6,7]
  |       |   |        |
  |       |   |        |
  |       |   |   1    |
  |_______|   |________|
   stack       res

    然后判断左右节点是否有值,如果有依次压入栈中,此时左节点[2, 4, 5], 右节点为[3, 6, 7]
  |         |   |     |
  |[3, 6, 7]|   |     |
  |[2, 4, 5]|   |  1  |
  |_________|   |_____|
   stack        res

    重复执行上面的操作,从栈中取出一个二叉树
    根节点的值放到遍历栈中
  root = [3, 6, 7]
  |         |   |     |
  |         |   |  3  |
  |[2, 4, 5]|   |  1  |
  |_________|   |_____|
   stack        res

    然后判断左右节点是否有值,如果有依次压入栈中,此时左节点[6, null, null], 右节点为[7, null, null]
  |         |   |     |  
  |[7, #, #]|   |     |
  |[6, #, #]|   |  3  |
  |[2, 4, 5]|   |  1  |
  |_________|   |_____|
   stack        res
   接下来重复上面的操作

    root = [7, #, #]
  |         |   |     |  
  |         |   |  7  |
  |[6, #, #]|   |  3  |
  |[2, 4, 5]|   |  1  |
  |_________|   |_____|
   stack        res

    root = [6, #, #]
  |         |   |  6  |  
  |         |   |  7  |
  |         |   |  3  |
  |[2, 4, 5]|   |  1  |
  |_________|   |_____|
   stack        res

    root = [2, 4, 5]    [4, #, #]  [5, #, #]
  |         |   |  2  | 
  |         |   |  6  |  
  |         |   |  7  |
  |         |   |  3  |
  |         |   |  1  |
  |_________|   |_____|
   stack        res

  |         |   |  2  | 
  |         |   |  6  |  
  |         |   |  7  |
  |[5, #, #]|   |  3  |
  |[4, #, #]|   |  1  |
  |_________|   |_____|
   stack        res

    root = [5,#,#]
  |         |   |  5  |  
  |         |   |  2  | 
  |         |   |  6  |  
  |         |   |  7  |
  |         |   |  3  |
  |[4, #, #]|   |  1  |
  |_________|   |_____|
   stack        res
    root = [4,#,#]
  |         |   |  4  | 
  |         |   |  5  |  
  |         |   |  2  | 
  |         |   |  6  |  
  |         |   |  7  |
  |         |   |  3  |
  |         |   |  1  |
  |_________|   |_____|
   stack        res

代码

递归方式

var postorderTraversal = function(root) {
    // 递归
    if (!root) return []
    // 前序遍历 左 右 中
    let res = [];
    traversal(root, res);
    return res;
};

var traversal = function (root, res) {
    if (root.left) traversal(root.left, res)
    if (root.right) traversal(root.right, res)
    res.push(root.val)
}

迭代

var postorderTraversal = function(root) {
    // 迭代
    if (!root) return []
    let res = [], stack = [root];
    while (stack.length) {
        let root = stack.pop()
        res.unshift(root.val)
        if (root.left) stack.push(root.left)
        if (root.right) stack.push(root.right)
    }
    return res;
};