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+
8587class 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
133137class 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 */
172283var 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