给定一个二叉树的根节点 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;
};