-
Notifications
You must be signed in to change notification settings - Fork 126
/
Copy pathL0226_InvertBinaryTree.java
150 lines (129 loc) · 4.15 KB
/
L0226_InvertBinaryTree.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
139
140
141
142
143
144
145
146
147
148
149
150
import java.util.LinkedList;
import java.util.Queue;
/**
* https://leetcode.cn/problems/invert-binary-tree/
*
* 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
*
* 示例 1:
* 
* 输入:root = [4,2,7,1,3,6,9]
* 输出:[4,7,2,9,6,3,1]
*
* 示例 2:
* 
* 输入:root = [2,1,3]
* 输出:[2,3,1]
*
* 示例 3:
* 输入:root = []
* 输出:[]
*
* 提示:
* - 树中节点数目范围在 [0, 100] 内
* - -100 <= Node.val <= 100
*/
public class L0226_InvertBinaryTree {
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;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
toString(this, sb);
return sb.toString();
}
private void toString(TreeNode node, StringBuilder sb) {
if (node == null) {
sb.append("null");
return;
}
sb.append(node.val);
if (node.left != null || node.right != null) {
sb.append(",");
toString(node.left, sb);
sb.append(",");
toString(node.right, sb);
}
}
}
/**
* 递归解法
* 对于每个节点,交换其左右子树
*/
public TreeNode invertTree(TreeNode root) {
// 如果根节点为空,直接返回
if (root == null) {
return null;
}
// 递归翻转左右子树
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
// 交换左右子树
root.left = right;
root.right = left;
return root;
}
/**
* 迭代解法
* 使用队列进行层序遍历,对每个节点交换其左右子树
*/
public TreeNode invertTreeIterative(TreeNode root) {
if (root == null) {
return null;
}
Queue<TreeNode> queue = new LinkedList<>();
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;
}
public static void main(String[] args) {
L0226_InvertBinaryTree solution = new L0226_InvertBinaryTree();
// 测试用例 1
TreeNode root1 = new TreeNode(4);
root1.left = new TreeNode(2);
root1.right = new TreeNode(7);
root1.left.left = new TreeNode(1);
root1.left.right = new TreeNode(3);
root1.right.left = new TreeNode(6);
root1.right.right = new TreeNode(9);
System.out.println("原始树:" + root1);
TreeNode inverted1 = solution.invertTree(root1);
System.out.println("翻转后:" + inverted1);
// 测试用例 2
TreeNode root2 = new TreeNode(2);
root2.left = new TreeNode(1);
root2.right = new TreeNode(3);
System.out.println("\n原始树:" + root2);
TreeNode inverted2 = solution.invertTreeIterative(root2);
System.out.println("翻转后:" + inverted2);
// 测试用例 3
TreeNode root3 = null;
System.out.println("\n原始树:" + root3);
TreeNode inverted3 = solution.invertTree(root3);
System.out.println("翻转后:" + inverted3);
}
}