Skip to content

Commit 50cdc24

Browse files
committed
Create 145.二叉树的后序遍历(中等).md
1 parent 40502a0 commit 50cdc24

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
```text
2+
题目: 给定一个二叉树,返回它的"后序"遍历;(后序遍历: 遍历左子节点,再遍历右子节点,再是父节点)
3+
1.递归:
4+
[1]思路: 使用递归实现后序遍历
5+
(1)确定递归方法的参数: 需要进行递归的树节点,用以保存节点值的结果集
6+
(2)确定递归逻辑: 先遍历左子节点,再遍历右子节点,再添加父节点
7+
(3)确定递归方法的退出条件
8+
[2]实现:
9+
class Solution {
10+
public List<Integer> postorderTraversal(TreeNode root) {
11+
// 对节点进行判空
12+
if(root == null){
13+
return new ArrayList<>();
14+
}
15+
List<Integer> result = new ArrayList<>();
16+
dfs(root,result);
17+
return result;
18+
}
19+
private void dfs(TreeNode node, List<Integer> result) {
20+
// 递归遍历退出的条件
21+
if(node == null){
22+
return;
23+
}
24+
// 递归遍历左子节点
25+
if(node.left != null){
26+
dfs(node.left,result);
27+
}
28+
// 递归遍历右子节点
29+
if(node.right != null){
30+
dfs(node.right,result);
31+
}
32+
// 添加父节点值
33+
result.add(node.val);
34+
}
35+
}
36+
public class TreeNode {
37+
int val;
38+
TreeNode left;
39+
TreeNode right;
40+
TreeNode(int x) { val = x; }
41+
}
42+
[3]复杂度分析:
43+
(1)时间复杂度: O(N),递归过程中每个节点会遍历到一次
44+
(2)空间复杂度: O(N),递归遍历到每个节点时,都需要入栈(用栈结构保存)
45+
2.栈:
46+
[1]思路: 使用栈优化递归实现后序遍历
47+
(1)向栈中添加需要遍历的节点,再去遍历栈,每次遍历取栈顶节点(父节点)
48+
(2)父节点一旦遍历到必须取出,否则会导致死循环,这时就得考虑父节点值的添加位置
49+
(3)由于后续遍历是左右中,所以可以先输出中的值,再遍历添加右子节点,再添加左子节点
50+
[2]实现:
51+
class Solution {
52+
public List<Integer> postorderTraversal(TreeNode root) {
53+
// 对节点进行判空
54+
if(root == null){
55+
return new LinkedList<>();
56+
}
57+
LinkedList<Integer> result = new LinkedList<>();
58+
// 使用双端队列使用栈
59+
Deque<TreeNode> stack = new ArrayDeque<>();
60+
stack.push(root);
61+
while (!stack.isEmpty()){
62+
// 取出栈顶元素(上一层的父节点)
63+
TreeNode node = stack.pop();
64+
// 按左右中的顺序,父节点值要输出就得放最后(即其他节点遍历值放父节点前面)
65+
result.addFirst(node.val);
66+
// 添加左子节点
67+
if(node.left != null){
68+
stack.push(node.left);
69+
}
70+
// 添加右子节点
71+
if(node.right != null){
72+
stack.push(node.right);
73+
}
74+
}
75+
return result;
76+
}
77+
}
78+
public class TreeNode {
79+
int val;
80+
TreeNode left;
81+
TreeNode right;
82+
TreeNode(int x) { val = x; }
83+
}
84+
[3]复杂度分析:
85+
(1)时间复杂度: O(N)
86+
(2)空间复杂度: O(N)
87+
```

0 commit comments

Comments
 (0)