面試題36. 二叉搜索樹與雙向鏈表

輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的循環雙向鏈表。要求不能創建任何新的節點,只能調整樹中節點指針的指向。
思路:中序遍歷,其它技巧未掌握,後面多看幾遍,看看有什麼收穫。

本題帶入三個節點的二叉樹:
             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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章