輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的循環雙向鏈表。要求不能創建任何新的節點,只能調整樹中節點指針的指向。
思路:中序遍歷,其它技巧未掌握,後面多看幾遍,看看有什麼收穫。
本題帶入三個節點的二叉樹:
5
/ \
4 8
結果如下:
5
// \\
(self.head) 4 = 8(self.pre)
# Definition for a Node.
class Node:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def __init__(self):
self.head, self.pre = None, None
def treeToDoublyList(self, root: 'Node') -> 'Node':
if not root:
return None
# 二叉搜索樹的中序遍歷是遞增的,因此把標準中序遍歷中 改變每個父節點的左右指向即可
# head, pre, tail = None,None,None # 不是集合,要在def裏引用的話得放在__init__(self)裏
def inorder(node=root):
if node:
# 中序遍歷,先left
inorder(node.left)
# 中間部分重點理解記憶
#1.當self.pre爲空的時候,用head記錄頭節點
#2.否則就是建立雙向鏈表操作
#3.最後移動pre到當前node
# 中序遍歷,然後父節點
if not self.pre:
self.head = node #記錄初始頭節點
else:
self.pre.right, node.left = node, self.pre # 按順序鏈接節點
self.pre = node
# 中序遍歷,最後 right
inorder(node.right)
inorder()
self.head.left, self.pre.right = self.pre, self.head # 鏈接首位節點,跳出遞歸的pre是最後一個節點
return self.head
a = Node('2')
b = Node('1')
c = Node('3')
a.left = b
a.right = c
Solution().treeToDoublyList(a)