-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathSolution.java
138 lines (125 loc) · 3.75 KB
/
Solution.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
131
132
133
134
135
136
137
138
package ds.reverse.leetcode226;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack;
/**
* 翻转二叉树
* LeetCode 226 https://leetcode-cn.com/problems/invert-binary-tree/
*
* @author yangyi 2019年02月10日16:57:38
*/
public class Solution {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
/**
* 递归方式遍历反转
*/
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
return root;
}
/**
* 层序遍历方式反转
*/
public TreeNode invertTreeByQueue(TreeNode root) {
if (root == null) {
return null;
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
return root;
}
/**
* 深度优先遍历的方式反转
*/
private TreeNode invertTreeByStack(TreeNode root) {
if (root == null) {
return null;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
int size = stack.size();
for (int i = 0; i < size; i++) {
TreeNode cur = stack.pop();
TreeNode temp = cur.left;
cur.left = cur.right;
cur.right = temp;
if (cur.right != null) {
stack.push(cur.right);
}
if (cur.left != null) {
stack.push(cur.left);
}
}
}
return root;
}
public TreeNode createTree() {
TreeNode val_4 = new TreeNode(4);
TreeNode val_2 = new TreeNode(2);
TreeNode val_7 = new TreeNode(7);
TreeNode val_1 = new TreeNode(1);
TreeNode val_3 = new TreeNode(3);
TreeNode val_6 = new TreeNode(6);
TreeNode val_9 = new TreeNode(9);
val_4.left = val_2;
val_4.right = val_7;
val_2.left = val_1;
val_2.right = val_3;
val_7.left = val_6;
val_7.right = val_9;
return val_4;
}
public void inOrder(TreeNode node) {
if (node == null) {
return;
}
inOrder(node.left);
System.out.print(node.val + "——>");
inOrder(node.right);
}
public static void main(String[] args) {
Solution invertTree = new Solution();
TreeNode node = invertTree.createTree();
System.out.println("先中序遍历打印一遍反转前的结果:");
invertTree.inOrder(node);
System.out.println();
System.out.println("再中序遍历打印一遍反转后的结果:");
TreeNode newNode = invertTree.invertTree(node);
invertTree.inOrder(newNode);
System.out.println();
System.out.println("再中序遍历打印一遍反转后的结果:");
TreeNode newNode2 = invertTree.invertTreeByQueue(node);
invertTree.inOrder(newNode2);
System.out.println();
System.out.println("再中序遍历打印一遍反转后的结果:");
TreeNode newNode3= invertTree.invertTreeByStack(node);
invertTree.inOrder(newNode3);
}
}