Skip to content

Commit 986c1f8

Browse files
committed
114. 二叉树展开为链表
1 parent 2bd0aeb commit 986c1f8

File tree

4 files changed

+132
-3
lines changed

4 files changed

+132
-3
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
101. 对称二叉树
33
102. 二叉树的层序遍历
44
104. 二叉树的最大深度
5+
114. 二叉树展开为链表
56
144. 二叉树的前序遍历
67
145. 二叉树的后序遍历
78
226. 翻转二叉树

leetcode_Java/Solution0094.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,11 @@ public List<Integer> inorderTraversal(TreeNode root) {
109109

110110

111111
/*
112-
* 莫里斯遍历:用递归和迭代的方式都使用了辅助的空间,而莫里斯遍历的优点是没有使用任何辅助空间。
113-
* 缺点是改变了整个树的结构,强行把一棵二叉树改成一段链表结构。
114-
* 思路:把根节点接到左子树的最后一个右节点上,形成链表,再遍历获取链表的值
112+
* 1、莫里斯遍历:
113+
* 1)用递归和迭代的方式都使用了辅助的空间,而莫里斯遍历的优点是没有使用任何辅助空间。
114+
* 2)缺点是改变了整个树的结构,强行把一棵二叉树改成一段链表结构。
115+
* 2、思路:把根节点接到左子树的最后一个右节点上,形成链表,再遍历获取链表的值
116+
* 3、相似题:114.二叉树展开为链表,前序遍历
115117
* */
116118
class Solution {
117119
public List<Integer> inorderTraversal(TreeNode root) {

leetcode_Java/Solution0114.java

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
// 二叉树展开为链表
2+
3+
4+
/**
5+
* Definition for a binary tree node.
6+
* public class TreeNode {
7+
* int val;
8+
* TreeNode left;
9+
* TreeNode right;
10+
* TreeNode() {}
11+
* TreeNode(int val) { this.val = val; }
12+
* TreeNode(int val, TreeNode left, TreeNode right) {
13+
* this.val = val;
14+
* this.left = left;
15+
* this.right = right;
16+
* }
17+
* }
18+
*/
19+
20+
21+
/*
22+
* 迭代思路:
23+
* 1、简单理解:把左子树塞到根节点和右节点中间,每个节点都要做同样的操作
24+
* 2、简单情况分析:
25+
* 1)根节点为空:直接返回列表
26+
* 2)只有根节点:将根节点的值存入列表,返回列表
27+
* 3)有根节点和左节点:将左节点移到右节点的位置,遍历右节点将值存入列表,返回列表
28+
* 4)有根节点和右节点:不用移动,遍历右节点将值存入列表,返回列表
29+
* 5)有根节点、左节点、右节点:将左节点移到根节点和右节点中间,遍历右节点将值存入列表,返回列表
30+
* 3、节点连接步骤:
31+
* 1)前序遍历是中左右,即根节点→左子树→右子树
32+
* 2)左子树遍历的最后一个节点是 左子树的最后一个右子节点,因此要将其连接到根节点的右节点上
33+
* 3)根节点的右指针要指向左节点,左指针指向空,从而形成中左右的链表
34+
* 4、遍历逻辑:
35+
* 1)根指针的移动代表着前序遍历的顺序,循环遍历条件是根指针不为空
36+
* 2)如果根节点的左节点不为空,则进行节点连接步骤;如果为空,则将节点值存入列表
37+
* 3)根节点处理完后看,根指针指向右节点,准备下一轮判断
38+
* 5、“144.二叉树的前序遍历”展开为链表的解法
39+
* */
40+
class Solution {
41+
public List<Integer> flatten(TreeNode root) {
42+
List<Integer> list = new ArrayList<>();
43+
while (root != null) {
44+
if (root.left != null) {
45+
TreeNode pre = root.left;
46+
while (pre.right != null) {
47+
pre = pre.right;
48+
}
49+
pre.right = root.right;
50+
root.right = root.left;
51+
root.left = null;
52+
} else {
53+
list.add(root.val);
54+
}
55+
root = root.right;
56+
}
57+
return list;
58+
}
59+
}
60+
61+
62+
/*
63+
* 迭代思路:与上个解法相同。用队列/栈存储下一个要遍历的节点,替代了遍历指针,缺点是使用了多余的空间
64+
* */
65+
class Solution {
66+
public List<Integer> flatten(TreeNode root) {
67+
List<Integer> list = new ArrayList<>();
68+
if (root == null) {
69+
return list;
70+
}
71+
Queue<TreeNode> queue = new LinkedList<>();
72+
queue.offer(root);
73+
while (!queue.isEmpty()) {
74+
root = queue.poll();
75+
if (root.left != null) {
76+
TreeNode pre = root.left;
77+
while (pre.right != null) {
78+
pre = pre.right;
79+
}
80+
pre.right = root.right;
81+
root.right = root.left;
82+
root.left = null;
83+
} else {
84+
list.add(root.val);
85+
}
86+
if (root.right != null) {
87+
queue.offer(root.right);
88+
}
89+
}
90+
return list;
91+
}
92+
}

leetcode_Java/Solution0144.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,38 @@ public List<Integer> preorderTraversal(TreeNode root) {
171171
}
172172
return resList;
173173
}
174+
}
175+
176+
177+
/*
178+
* 迭代思路:
179+
* 1、简单理解:把左子树塞到根节点和右节点中间,每个节点都要做同样的操作
180+
* 2、节点连接步骤:
181+
* 1)前序遍历是中左右,即根节点→左子树→右子树
182+
* 2)左子树遍历的最后一个节点是 左子树的最后一个右子节点,因此要将其连接到根节点的右节点上
183+
* 3)根节点的右指针要指向左节点,左指针指向空,从而形成中左右的链表
184+
* 2、遍历逻辑:
185+
* 1)根指针的移动代表着前序遍历的顺序,循环遍历条件是根指针不为空
186+
* 2)如果根节点的左节点不为空,则进行节点连接步骤;如果为空,则将节点值存入列表,根指针指向右节点
187+
* 3、“114.二叉树展开为链表”的解法
188+
* */
189+
class Solution {
190+
public List<Integer> flatten(TreeNode root) {
191+
List<Integer> list = new ArrayList<>();
192+
while (root != null) {
193+
if (root.left != null) {
194+
TreeNode temp = root.left;
195+
while (temp.right != null) {
196+
temp = temp.right;
197+
}
198+
temp.right = root.right;
199+
root.right = root.left;
200+
root.left = null;
201+
} else {
202+
list.add(root.val);
203+
root = root.right;
204+
}
205+
}
206+
return list;
207+
}
174208
}

0 commit comments

Comments
 (0)