BST:剑指 Offer 36. 二叉搜索树与双向链表

Smile_slime_47

原题地址:https://leetcode.cn/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/

题解

对于一个节点,我们先求出左子树的链表形态和右子树的链表形态

  • 对于这个节点,其前驱等于左子树链表的最后一个元素
  • 对于这个节点,其后驱等于右子树链表的第一个元素

此时我们将这个节点的左子树+自己+右子树重新整合成一个链表

  • 同理地,对于这个节点的父节点
  • 若该节点为父节点的左节点,则返回整合后链表的最后一个元素
  • 若该节点为父节点的右节点,则返回整合后链表的第一个元素

当根节点整合完毕后,找到链表的第一个元素first和最后一个元素end,连接first的left和end的right,然后返回first节点即可

时间复杂度:O(N)

空间复杂度:O(1)

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
class Solution {
public Node treeToDoublyList(Node root) {
Node node=DFS(root,null);
return node;
}

Node DFS(Node node,Node parent){
if(node==null)return null;
node.left=DFS(node.left,node);
if(node.left!=null)node.left.right=node;
node.right=DFS(node.right,node);
if(node.right!=null)node.right.left=node;


if(parent==null){
Node first=node,end=node;
while(first.left!=null){
first=first.left;
}
while(end.right!=null){
end=end.right;
}
first.left=end;
end.right=first;
return first;
}else if(node==parent.left){
while(node.right!=null){
node=node.right;
}
return node;
}else if(node==parent.right){
while(node.left!=null){
node=node.left;
}
return node;
}
return node;
}
}
Comments
On this page
BST:剑指 Offer 36. 二叉搜索树与双向链表