Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
219 lines (209 loc) · 6.48 KB

File metadata and controls

219 lines (209 loc) · 6.48 KB
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
package basic.tree;
import java.util.*;
/**
* @author JunjunYang
* @date 2020/1/1 12:10
*/
public class TraverseOrder {
/**
* 递归前序遍历
*
* @param root
* @return
*/
public static List<Integer> preOrderRecursion(TreeNode root) {
List<Integer> list = new ArrayList<>();
preOrderRecursion(root, list);
return list;
}
private static void preOrderRecursion(TreeNode root, List<Integer> ans) {
if (root != null) {
ans.add(root.val);
preOrderRecursion(root.left,ans);
preOrderRecursion(root.right,ans);
}
}
/**
* 非递归前序遍历
*
* @param root
* @return
*/
public static List<Integer> preOrderIterator(TreeNode root) {
List<Integer> ans = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node != null) {
ans.add(node.val);
//先放入右节点
stack.add(node.right);
stack.add(node.left);
}
}
return ans;
}
/**
* 非递归中序遍历
*
* @param root
* @return
*/
public static List<Integer> midOrderIterator(TreeNode root) {
List<Integer> ans = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (root != null || !stack.empty()) {
//dfs,将所有左节点压栈,然后依次pop出来,达到回溯的效果
while (root != null) {
stack.add(root);
root = root.left;
}
//去除最左的叶子节点
root = stack.pop();
ans.add(root.val);
//把右子树放到栈中
root = root.right;
}
return ans;
}
/**
* 非递归后续遍历
* 解法一:逆序插入值
*
* @param root
* @return
*/
public static List<Integer> postOrderIterator(TreeNode root) {
LinkedList<Integer> ans = new LinkedList<>();
if (root == null) {
return ans;
}
Stack<TreeNode> stack = new Stack<>();
stack.add(root);
while (!stack.empty()) {
TreeNode node = stack.pop();
//先将根节点插入最后一位,然后将左节点右节点推入栈中。
ans.addFirst(node.val);
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
return ans;
}
/**
* 非递归后序遍历
* 解法二
*
* @param root
* @return
*/
public static List<Integer> postOrderIterator2(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
TreeNode pre = null;
TreeNode current = root;
while (current != null || !stack.isEmpty()) {
while (current != null) {
stack.push(current);
current = current.left;
}
current = stack.peek();
//当前节点右子节点不为null且未被访问过
if (current.right != null && pre != current.right) {
current = current.right;
} else {
stack.pop();
list.add(current.val);
pre = current;
current = null;
}
}
return list;
}
/**
* 非递归层次遍历
* (左视图和右视图都是层次遍历的一个变种,取每层最左边的值或者最右边的值)
*
* @param root
* @return
*/
public static List<List<Integer>> leverOrderIterator(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) return ans;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
List<Integer> cur = new ArrayList<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
//放入当前节点
cur.add(node.val);
//将当前节点的左右子节点加入队列中
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
ans.add(cur);
}
return ans;
}
/**
* 层次遍历
*
* @param root
* @return
*/
public static List<List<Integer>> leverOrderRecursion(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
leverOrderRecursion(root, ans, 0);
return ans;
}
private static void leverOrderRecursion(TreeNode root, List<List<Integer>> ans, int level) {
if (root == null) return;
if (ans.size() == level) {
ans.add(new ArrayList<>());
}
ans.get(level).add(root.val);
leverOrderRecursion(root.left, ans, level + 1);
leverOrderRecursion(root.right, ans, level + 1);
}
/**
* 之字形层次遍历
* 103. Binary Tree Zigzag Level Order Traversal
* Given binary tree [3,9,20,null,null,15,7],
* 3
* / \
* 9 20
* / \
* 15 7
* return its zigzag level order traversal as:
* [
* [3],
* [20,9],
* [15,7]
* ]
*/
public static List<List<Integer>> levelOrderRecursionZigzag(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
levelOrderRecursionZigzag(root,result,0);
return result;
}
private static void levelOrderRecursionZigzag(TreeNode root, List<List<Integer>> result, int level) {
if(root == null) return;
if(result.size() == level) {
result.add(new LinkedList<>());
}
// 正向遍历
if(level%2 == 0) {
((LinkedList)result.get(level)).add(root.val);
}else {
((LinkedList)result.get(level)).addFirst(root.val);
}
levelOrderRecursionZigzag(root.left, result, level+1);
levelOrderRecursionZigzag(root.right, result, level+1);
}
}
Morty Proxy This is a proxified and sanitized view of the page, visit original site.