[路飞]_程序员必刷力扣题: 145. 二叉树的后序遍历

194 阅读1分钟

「这是我参与12月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

145. 二叉树的后序遍历

力扣链接

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

示例 :

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

输出: [3,2,1]

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

递归

思路

递归的思路很简单

  • 处理边界条件
  • 分别处理左子树和右子树,最后放入root的值就好了
var postorderTraversal = function(root) {
    if(!root) return []
    var res = []
    res = res.concat(postorderTraversal(root.left))
    res = res.concat(postorderTraversal(root.right))
    res.push(root.val)
    return res
};

遍历

思路

另外一种就是通过遍历

遍历的话我们可以用深度优先遍历 也可以用层序遍历, 这里我们使用深度优先遍历

  • 处理边界条件
  • 首先声明一个栈用来保存需要处理的节点,声明一个res数组,用来保存后序遍历的结果
  • 将root拆分成三部分,root 以及左右子树,按照后序遍历的反顺序放入stack中

因为我们使用stack的尾部获取node节点,所以刚好与后续遍历的顺序要相反

获取到节点以后,分别处理root节点,right以及left再次放入

检测node节点是否没有子节点,没有的话就直接将结果放入res

如果有子节点,则按照root->right->left的顺序放入stack,这里root要处理成无子节点的单节点

最后当stack中所有节点都弹出后,遍历结束,返回res

var postorderTraversal = function (root) {
    if (!root) return []
    var stack = []
    var res = []
    stack.push(root)
    while (stack.length > 0) {
        var node = stack.pop()
        if (!node.left && !node.right) {
            res.push(node.val)
            continue
        }
        var left = node.left
        var right = node.right
        node.left = node.right = null
        stack.push(node)
        if (right) {
            stack.push(right)
        }
        if (left) {
            stack.push(left)
        }
    }
    return res
}