Skip to content

Commit ab9c000

Browse files
committed
feat: add solutions to lc problem: No.0426
No.0426.Convert Binary Search Tree to Sorted Doubly Linked List
1 parent cc96632 commit ab9c000

File tree

8 files changed

+494
-195
lines changed

8 files changed

+494
-195
lines changed

solution/0400-0499/0426.Convert Binary Search Tree to Sorted Doubly Linked List/README.md

+162-46
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66-
- 排序链表:二叉搜索树中序遍历得到有序序列
67-
- 循环链表:头节点指向链表尾节点,尾节点指向链表头节点
68-
- 双向链表:`pre.right = cur``cur.left = pre``pre = cur`
66+
- 排序链表:二叉搜索树中序遍历得到有序序列
67+
- 循环链表:头节点指向链表尾节点,尾节点指向链表头节点
68+
- 双向链表:`prev.right = cur``cur.left = prev``prev = cur`
6969

7070
<!-- tabs:start -->
7171

@@ -82,26 +82,30 @@ class Node:
8282
self.left = left
8383
self.right = right
8484
"""
85+
86+
8587
class Solution:
86-
def treeToDoublyList(self, root: 'Node') -> 'Node':
87-
def dfs(cur):
88-
if cur is None:
88+
def treeToDoublyList(self, root: 'Optional[Node]') -> 'Optional[Node]':
89+
def dfs(root):
90+
if root is None:
8991
return
90-
dfs(cur.left)
91-
if self.pre is None:
92-
self.head = cur
92+
nonlocal prev, head
93+
dfs(root.left)
94+
if prev:
95+
prev.right = root
96+
root.left = prev
9397
else:
94-
self.pre.right = cur
95-
cur.left = self.pre
96-
self.pre = cur
97-
dfs(cur.right)
98+
head = root
99+
prev = root
100+
dfs(root.right)
101+
98102
if root is None:
99103
return None
100-
self.head = self.pre = None
104+
head = prev = None
101105
dfs(root)
102-
self.head.left = self.pre
103-
self.pre.right = self.head
104-
return self.head
106+
prev.right = head
107+
head.left = prev
108+
return head
105109
```
106110

107111
### **Java**
@@ -131,26 +135,132 @@ class Node {
131135
*/
132136

133137
class Solution {
138+
private Node prev;
134139
private Node head;
135-
private Node pre;
136140

137141
public Node treeToDoublyList(Node root) {
138-
if (root == null) return null;
142+
if (root == null) {
143+
return null;
144+
}
145+
prev = null;
146+
head = null;
147+
dfs(root);
148+
prev.right = head;
149+
head.left = prev;
150+
return head;
151+
}
152+
153+
private void dfs(Node root) {
154+
if (root == null) {
155+
return;
156+
}
157+
dfs(root.left);
158+
if (prev != null) {
159+
prev.right = root;
160+
root.left = prev;
161+
} else {
162+
head = root;
163+
}
164+
prev = root;
165+
dfs(root.right);
166+
}
167+
}
168+
```
169+
170+
### **C++**
171+
172+
```cpp
173+
/*
174+
// Definition for a Node.
175+
class Node {
176+
public:
177+
int val;
178+
Node* left;
179+
Node* right;
180+
181+
Node() {}
182+
183+
Node(int _val) {
184+
val = _val;
185+
left = NULL;
186+
right = NULL;
187+
}
188+
189+
Node(int _val, Node* _left, Node* _right) {
190+
val = _val;
191+
left = _left;
192+
right = _right;
193+
}
194+
};
195+
*/
196+
197+
class Solution {
198+
public:
199+
Node* prev;
200+
Node* head;
201+
202+
Node* treeToDoublyList(Node* root) {
203+
if (!root) return nullptr;
204+
prev = nullptr;
205+
head = nullptr;
139206
dfs(root);
140-
head.left = pre;
141-
pre.right = head;
207+
prev->right = head;
208+
head->left = prev;
142209
return head;
143210
}
144211

145-
private void dfs(Node cur) {
146-
if (cur == null) return;
147-
dfs(cur.left);
148-
if (pre == null) head = cur;
149-
else pre.right = cur;
150-
cur.left = pre;
151-
pre = cur;
152-
dfs(cur.right);
212+
void dfs(Node* root) {
213+
if (!root) return;
214+
dfs(root->left);
215+
if (prev)
216+
{
217+
prev->right = root;
218+
root->left = prev;
219+
}
220+
else head = root;
221+
prev = root;
222+
dfs(root->right);
153223
}
224+
};
225+
```
226+
227+
### **Go**
228+
229+
```go
230+
/**
231+
* Definition for a Node.
232+
* type Node struct {
233+
* Val int
234+
* Left *Node
235+
* Right *Node
236+
* }
237+
*/
238+
239+
func treeToDoublyList(root *Node) *Node {
240+
if root == nil {
241+
return root
242+
}
243+
var prev, head *Node
244+
245+
var dfs func(root *Node)
246+
dfs = func(root *Node) {
247+
if root == nil {
248+
return
249+
}
250+
dfs(root.Left)
251+
if prev != nil {
252+
prev.Right = root
253+
root.Left = prev
254+
} else {
255+
head = root
256+
}
257+
prev = root
258+
dfs(root.Right)
259+
}
260+
dfs(root)
261+
prev.Right = head
262+
head.Left = prev
263+
return head
154264
}
155265
```
156266

@@ -159,31 +269,37 @@ class Solution {
159269
```js
160270
/**
161271
* // Definition for a Node.
162-
* function Node(val,left,right) {
163-
* this.val = val;
164-
* this.left = left;
165-
* this.right = right;
166-
* };
272+
* function Node(val, left, right) {
273+
* this.val = val;
274+
* this.left = left;
275+
* this.right = right;
276+
* };
167277
*/
278+
168279
/**
169280
* @param {Node} root
170281
* @return {Node}
171282
*/
172283
var treeToDoublyList = function (root) {
173-
function dfs(cur) {
174-
if (!cur) return;
175-
dfs(cur.left);
176-
if (!pre) head = cur;
177-
else pre.right = cur;
178-
cur.left = pre;
179-
pre = cur;
180-
dfs(cur.right);
284+
if (!root) return root;
285+
let prev = null;
286+
let head = null;
287+
288+
function dfs(root) {
289+
if (!root) return;
290+
dfs(root.left);
291+
if (prev) {
292+
prev.right = root;
293+
root.left = prev;
294+
} else {
295+
head = root;
296+
}
297+
prev = root;
298+
dfs(root.right);
181299
}
182-
if (!root) return null;
183-
let head, pre;
184300
dfs(root);
185-
head.left = pre;
186-
pre.right = head;
301+
prev.right = head;
302+
head.left = prev;
187303
return head;
188304
};
189305
```

0 commit comments

Comments
 (0)