題目:
思路+代碼:
class Solution:
# 思路:二叉搜索樹中序遍歷纔是遞增,又因爲要求是雙向鏈表,cur.left= self.pre; self.pre.right=cur
# 特例:如果root不存在,return
# 初始化self.pre=None
# 遞歸調用中序遍歷,構建除首尾兩個節點之外的雙向鏈表;
# 中序遍歷遞歸結束後,設置head.left = pre; pre.right=head,構成循環鏈表
# 遞歸思路:
# 1.遞歸結束:if not root說明到達葉子節點;
# 2.當前遞歸層:對當前節點,cur.left=pre; pre.right=cur;進行左,根,右遞歸順序;並在第一時間找出head節點
# 3.返回值:沒有返回值,因爲已經設置了self.head
def treeToDoublyList(self, root: 'Node') -> 'Node':
def recur(root):
if not root: return
recur(root.left)
if self.pre:
self.pre.right, root.left = root, self.pre
else:
self.head = root
self.pre = root
recur(root.right)
if not root:
return
self.pre = None
recur(root)
self.head.left, self.pre.right = self.pre, self.head
return self.head