# 145. 二叉树的后序遍历
# 题目
给定一个二叉树,返回它的后序遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 题解
# 递归
/**
* 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) {
let ans = [];
const postOrder = node => {
if (!node) return;
postOrder(node.left);
postOrder(node.right);
ans.push(node.val);
};
postOrder(root);
return ans;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 迭代
/**
* 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) {
let ans = [];
if (!root) return ans;
let s = [root];
let pre = null;
while (s.length) {
const node = s[s.length - 1];
// 当前节点是叶节点或pre节点是当前节点的子节点
if (
(!node.left && !node.right) ||
(pre && (pre == node.left || pre == node.right))
) {
ans.push(node.val);
s.pop();
pre = node;
} else {
if (node.right) s.push(node.right);
if (node.left) s.push(node.left);
}
}
return ans;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33