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
class Solution {
private Node head, tail;

public Node treeToDoublyList(Node root) {
if (root == null) {
return null;
}
Node[] headTailPair = helper(root);
headTailPair[0].left = headTailPair[1];
headTailPair[1].right = headTailPair[0];
return headTailPair[0];
}

private Node[] helper(Node node) {
if (node == null) {
return new Node[] { null, null };
}
Node[] leftTree = helper(node.left);
Node[] rightTree = helper(node.right);
Node[] ans = new Node[] { node, node };
if (leftTree[1] != null) {
node.left = leftTree[1];
leftTree[1].right = node;
ans[0] = leftTree[0];
}
if (rightTree[0] != null) {
node.right = rightTree[0];
rightTree[0].left = node;
ans[1] = rightTree[1];
}
return ans;
}
}

递归函数干的事情就是把给定的树变成DLL但是首位不相接并且把处理好的链表的头尾以数组的形式给我们.

时间复杂度: O(n)
空间复杂度: O(n) 一个是递归, 还有就是每个node返回的时候都会分配一个长度为2的数组.

第15, 16行如果不想在遇到null的时候分配两个null数组, 可以看下面的这个解法. 就是只有在左支或者右支不是null的时候再去调用递归函数. 时间复杂度和空间复杂度不变.

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
class Solution {
private Node head, tail;

public Node treeToDoublyList(Node root) {
if (root == null) {
return null;
}
Node[] headTailPair = helper(root);
headTailPair[0].left = headTailPair[1];
headTailPair[1].right = headTailPair[0];
return headTailPair[0];
}

private Node[] helper(Node node) {
Node[] leftTree = null, rightTree = null;
if (node.left != null) {
leftTree = helper(node.left);
}
if (node.right != null) {
rightTree = helper(node.right);
}
Node[] ans = new Node[] { node, node };
if (leftTree != null) {
node.left = leftTree[1];
leftTree[1].right = node;
ans[0] = leftTree[0];
}
if (rightTree != null) {
node.right = rightTree[0];
rightTree[0].left = node;
ans[1] = rightTree[1];
}
return ans;
}
}