-
Notifications
You must be signed in to change notification settings - Fork 126
/
Copy pathL0145_BinaryTreePostorderTraversal.java
130 lines (112 loc) · 3.93 KB
/
L0145_BinaryTreePostorderTraversal.java
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import java.util.*;
/**
* https://leetcode.cn/problems/binary-tree-postorder-traversal/
*
* 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
*
* 示例 1:
* 
* 输入:root = [1,null,2,3]
* 输出:[3,2,1]
*
* 示例 2:
* 输入:root = []
* 输出:[]
*
* 示例 3:
* 输入:root = [1]
* 输出:[1]
*
* 提示:
* - 树中节点的数目在范围 [0, 100] 内
* - -100 <= Node.val <= 100
*
* 进阶:递归算法很简单,你可以通过迭代算法完成吗?
*/
public class L0145_BinaryTreePostorderTraversal {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
/**
* 递归解法
*/
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
postorderRecursive(root, result);
return result;
}
private void postorderRecursive(TreeNode node, List<Integer> result) {
if (node == null) {
return;
}
// 后序遍历:左子树 -> 右子树 -> 根节点
postorderRecursive(node.left, result);
postorderRecursive(node.right, result);
result.add(node.val);
}
/**
* 迭代解法
*/
public List<Integer> postorderTraversalIterative(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode current = root;
TreeNode lastVisited = null;
while (current != null || !stack.isEmpty()) {
// 将当前节点及其所有左子节点入栈
while (current != null) {
stack.push(current);
current = current.left;
}
// 查看栈顶节点
current = stack.peek();
// 如果右子节点为空或已经访问过,则访问当前节点
if (current.right == null || current.right == lastVisited) {
result.add(current.val);
stack.pop();
lastVisited = current;
current = null;
} else {
// 否则遍历右子树
current = current.right;
}
}
return result;
}
public static void main(String[] args) {
L0145_BinaryTreePostorderTraversal solution = new L0145_BinaryTreePostorderTraversal();
// 测试用例 1:[1,null,2,3]
TreeNode root1 = new TreeNode(1);
root1.right = new TreeNode(2);
root1.right.left = new TreeNode(3);
System.out.println("测试用例 1:");
System.out.println("递归解法输出: " + solution.postorderTraversal(root1));
System.out.println("迭代解法输出: " + solution.postorderTraversalIterative(root1));
System.out.println();
// 测试用例 2:空树
TreeNode root2 = null;
System.out.println("测试用例 2:");
System.out.println("递归解法输出: " + solution.postorderTraversal(root2));
System.out.println("迭代解法输出: " + solution.postorderTraversalIterative(root2));
System.out.println();
// 测试用例 3:单节点树
TreeNode root3 = new TreeNode(1);
System.out.println("测试用例 3:");
System.out.println("递归解法输出: " + solution.postorderTraversal(root3));
System.out.println("迭代解法输出: " + solution.postorderTraversalIterative(root3));
}
}