「这是我参与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
}