63
63
64
64
<!-- 这里可写通用的实现逻辑 -->
65
65
66
- - 排序链表:二叉搜索树中序遍历得到有序序列
67
- - 循环链表:头节点指向链表尾节点,尾节点指向链表头节点
68
- - 双向链表:` pre .right = cur` 、` cur.left = pre ` 、` pre = cur`
66
+ - 排序链表:二叉搜索树中序遍历得到有序序列
67
+ - 循环链表:头节点指向链表尾节点,尾节点指向链表头节点
68
+ - 双向链表:` prev .right = cur` 、` cur.left = prev ` 、` prev = cur`
69
69
70
70
<!-- tabs:start -->
71
71
@@ -82,26 +82,30 @@ class Node:
82
82
self.left = left
83
83
self.right = right
84
84
"""
85
+
86
+
85
87
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 :
89
91
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
93
97
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
+
98
102
if root is None :
99
103
return None
100
- self . head = self .pre = None
104
+ head = prev = None
101
105
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
105
109
```
106
110
107
111
### ** Java**
@@ -131,26 +135,132 @@ class Node {
131
135
*/
132
136
133
137
class Solution {
138
+ private Node prev;
134
139
private Node head;
135
- private Node pre;
136
140
137
141
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;
139
206
dfs(root);
140
- head . left = pre ;
141
- pre . right = head ;
207
+ prev->right = head ;
208
+ head->left = prev ;
142
209
return head;
143
210
}
144
211
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);
153
223
}
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
154
264
}
155
265
```
156
266
@@ -159,31 +269,37 @@ class Solution {
159
269
``` js
160
270
/**
161
271
* // 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
+ * };
167
277
*/
278
+
168
279
/**
169
280
* @param {Node} root
170
281
* @return {Node}
171
282
*/
172
283
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 );
181
299
}
182
- if (! root) return null ;
183
- let head, pre;
184
300
dfs (root);
185
- head . left = pre ;
186
- pre . right = head ;
301
+ prev . right = head ;
302
+ head . left = prev ;
187
303
return head;
188
304
};
189
305
```
0 commit comments