Skip to content

Commit a7395c9

Browse files
committed
添加 二叉树的统一迭代法.md Java版本boolean标记法
1 parent 1d3f7cf commit a7395c9

File tree

1 file changed

+106
-3
lines changed

1 file changed

+106
-3
lines changed

problems/二叉树的统一迭代法.md

Lines changed: 106 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ public:
225225
## 其他语言版本
226226

227227
### Java:
228-
迭代法前序遍历代码如下:
228+
迭代法前序遍历(空指针标记法)代码如下:
229229

230230
```java
231231
class Solution {
@@ -254,7 +254,42 @@ class Solution {
254254
}
255255
```
256256

257-
迭代法中序遍历代码如下:
257+
迭代法前序遍历(boolean标记法)代码如下:
258+
259+
```java
260+
class Solution {
261+
public List<Integer> preorderTraversal(TreeNode root) {
262+
List<Integer> res = new LinkedList<>();
263+
if (root == null) {
264+
return res;
265+
}
266+
Stack<Object[]> stack = new Stack<>();
267+
stack.push(new Object[]{root, false});
268+
269+
while (!stack.empty()) {
270+
TreeNode node = (TreeNode) stack.peek()[0];
271+
Boolean visited = (Boolean) stack.peek()[1];
272+
stack.pop();
273+
274+
if (visited) {
275+
res.add(node.val);
276+
} else { // 先序遍历:中左右,入栈顺序相反
277+
if (node.right != null) {
278+
stack.push(new Object[]{node.right, false});
279+
}
280+
if (node.left != null) {
281+
stack.push(new Object[]{node.left, false});
282+
}
283+
stack.push(new Object[]{node, true});
284+
}
285+
}
286+
return res;
287+
}
288+
}
289+
```
290+
291+
迭代法中序遍历(空指针标记法)代码如下:
292+
258293
```java
259294
class Solution {
260295
public List<Integer> inorderTraversal(TreeNode root) {
@@ -281,7 +316,41 @@ public List<Integer> inorderTraversal(TreeNode root) {
281316
}
282317
```
283318

284-
迭代法后序遍历代码如下:
319+
迭代法中序遍历(boolean标记法)代码如下:
320+
321+
```java
322+
class Solution {
323+
public List<Integer> inorderTraversal(TreeNode root) {
324+
List<Integer> res = new LinkedList<>();
325+
if (root == null) {
326+
return res;
327+
}
328+
Stack<Object[]> stack = new Stack<>();
329+
stack.push(new Object[]{root, false});
330+
while (!stack.empty()) {
331+
TreeNode node = (TreeNode) stack.peek()[0];
332+
Boolean visited = (Boolean) stack.peek()[1];
333+
stack.pop();
334+
335+
if (visited) {
336+
res.add(node.val);
337+
} else { // 中序遍历:左中右,入栈顺序相反
338+
if (node.right != null) {
339+
stack.push(new Object[]{node.right, false});
340+
}
341+
stack.push(new Object[]{node, true});
342+
if (node.left != null) {
343+
stack.push(new Object[]{node.left, false});
344+
}
345+
}
346+
}
347+
return res;
348+
}
349+
}
350+
```
351+
352+
迭代法后序遍历(空指针标记法)代码如下:
353+
285354
```java
286355
class Solution {
287356
public List<Integer> postorderTraversal(TreeNode root) {
@@ -309,6 +378,40 @@ class Solution {
309378
}
310379
```
311380

381+
迭代法后序遍历(boolean标记法)代码如下:
382+
383+
```java
384+
class Solution {
385+
public List<Integer> postorderTraversal(TreeNode root) {
386+
List<Integer> res = new LinkedList<>();
387+
if (root == null) {
388+
return res;
389+
}
390+
Stack<Object[]> stack = new Stack<>();
391+
stack.push(new Object[]{root, false});
392+
393+
while (!stack.empty()) {
394+
TreeNode node = (TreeNode) stack.peek()[0];
395+
Boolean visited = (Boolean) stack.peek()[1];
396+
stack.pop();
397+
398+
if (visited) {
399+
res.add(node.val);
400+
} else { // 后序遍历:左右中,入栈顺序相反
401+
stack.push(new Object[]{node, true});
402+
if (node.right != null) {
403+
stack.push(new Object[]{node.right, false});
404+
}
405+
if (node.left != null) {
406+
stack.push(new Object[]{node.left, false});
407+
}
408+
}
409+
}
410+
return res;
411+
}
412+
}
413+
```
414+
312415
### Python:
313416

314417
> 迭代法前序遍历(空指针标记法):

0 commit comments

Comments
 (0)