114. 二叉树展开为链表

二叉树展开为链表

LeetCode 114

英文版

中文版

本题还有其他两种解法 @windliang,我使用先序遍历,用栈存储右孩子节点的方法避免,右指针丢失。

解法1

变体的先序遍历,这题如果用正常的先序遍历的话,会丢失右孩子,为了更好的控制算法,用先序遍历的迭代形式,正常的先序遍历代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void preOrderStack(TreeNode root) {
if (root == null) {
return;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
System.out.println(root.val);
stack.push(root);
root = root.left;
}
root = stack.pop();
root = root.right;
}
}

还有一种特殊的先序遍历,提前将右孩子保存到栈中,我们利用这种遍历方式就可以防止右孩子的丢失了。由于栈是先进后出,所以我们先将右节点入栈。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void preorder(TreeNode root) {
if (root == null)
return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);

while (!stack.empty()) {
TreeNode node = stack.pop();
System.out.println(node.val + " ");

if (node.right != null)
stack.push(node.right);
if (node.left != null)
stack.push(node.left);
}
}

之前我们的思路如下:

题目其实就是将二叉树通过右指针,组成一个链表。
1 -> 2 -> 3 -> 4 -> 5 -> 6

我们知道题目给定的遍历顺序其实就是先序遍历的顺序,所以我们可以利用先序遍历的代码,每遍历一个节点,就将上一个节点的右指针更新为当前节点。

先序遍历的顺序是 1 2 3 4 5 6。

遍历到 2,把 1 的右指针指向 2。1 -> 2 3 4 5 6。

遍历到 3,把 2 的右指针指向 3。1 -> 2 -> 3 4 5 6。

因为我们用栈保存了右孩子,所以不需要担心右孩子丢失了。用一个 pre 变量保存上次遍历的节点。修改的代码如下:

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
/**
* @description: 将二叉树展开成linkedlist
* @author: rhsphere
* @since: 2019-11-05 14:42 by jdk 1.8
*/
public class FlattenBinaryTreeToList {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}

public void flatten(TreeNode root) {
if (root == null)
return;
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
stack.push(root);

while (!stack.empty()) {
TreeNode node = stack.pop();
/***********修改的地方*************/
if (pre != null) {
pre.right = node;
pre.left = null;
}


if (node.right != null)
stack.push(node.right);
if (node.left != null)
stack.push(node.left);


/***********修改的地方*************/
pre = node;
}
}
}

题目

给定一个二叉树,原地将它展开为链表。

例如,给定二叉树

1

/ \
2 5
/ \ \
3 4 6
将其展开为:

1
\
2
\
3
\
4
\
5
\
6


0%