题目
代码
执行用时:52 ms, 在所有 Python3 提交中击败了6.46% 的用户
内存消耗:16 MB, 在所有 Python3 提交中击败了65.47% 的用户
通过测试用例:50 / 50
class Solution:
def visit(self,root):
if not root:return
self.visit(root.left)
self.ans.append(root)
self.visit(root.right)
def treeToDoublyList(self, root: 'Node') -> 'Node':
if not root:return None
self.ans=[]
self.visit(root)
head=self.ans[0]
head.left=self.ans[-1]
self.ans[-1].right=head
pre=head
for i in range(1,len(self.ans)):
self.ans[i-1].right=self.ans[i]
self.ans[i].left=self.ans[i-1]
return head
【方法2】
执行用时:32 ms, 在所有 Python3 提交中击败了95.39% 的用户
内存消耗:16.2 MB, 在所有 Python3 提交中击败了13.99% 的用户
通过测试用例:50 / 50
class Solution:
def treeToDoublyList(self, root: 'Node') -> 'Node':
self.pre, self.head = None, None
# 中序遍历算法
def dfs(cur):
if not cur: return
dfs(cur.left)
# 如果pre不是空,即说明不是head节点,其值有之前的cur_node赋予,与当前访问的cur节点建立连接
if self.pre:
self.pre.right, cur.left = cur, self.pre
# 如果时空,说明开始访问第一个节点,把其赋值给头节点,只执行一次
else:
self.head = cur
# 将当前的值,赋值给pre,用于建立双向链表的节点
self.pre = cur
dfs(cur.right)
if not root: return
dfs(root)
# 头尾节点建立双向,此时pre指向尾节点,head一直指向头节点
self.head.left, self.pre.right = self.pre, self.head
return self.head