题目:
给定一个二叉树,返回它的 后序 遍历。
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶:
递归算法很简单,你可以通过迭代算法完成吗?
抛砖引玉
二叉树的后续遍历:先遍历左子树,在遍历右子树,最后遍历子树根节点
思路
先用“很简单”的递归算法解决下吧
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var postorderTraversal = function(root) {
if (root == null) return []
let _result = []
function dfs(node) {
if (node === null) return
if (node.left) dfs(node.left)
if (node.right) dfs(node.right)
_result.push(node.val)
}
dfs(root)
return _result
}
迭代,先处理左右子树再处理子树根节点
var postorderTraversal = function(root) {
if (root == null) return []
let _result = [],
queue = [root]
while (queue.length) {
let node = queue.pop()
// 子树根节点在其后面标记'root'
if (node !== 'root') {
queue.push(node)
queue.push('root')
// 先处理左右子树再处理子树根节点,注意处理顺序是从数组尾部开始所有先存又自身再存左子树
if (node.right) queue.push(node.right)
if (node.left) queue.push(node.left)
} else {
// 遇到root则说明其前一个节点是子树根节点
_result.push(queue.pop().val)
}
}
return _result
}