劍指offer第二版(Python3)--面試題36:二叉搜索樹與雙向鏈表

第2章 面試需要的基礎知識

第3章 高質量的代碼

第4章 解決面試題的思路

  面試題27:二叉樹的鏡像

  面試題29:順時針打印矩陣

  面試題30 :包含min函數的棧

  面試題31:棧的壓入、彈出序列

  面試題32:上往下打印二叉樹

  面試題33: 二叉搜索樹的後序遍歷序列

  面試題34: 二叉樹中和爲某一值的路徑

  面試題35:複雜鏈表的複製

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

第5章 優化時間和空間效率

第6章 面試中的各項能力

第7章 兩個面試案例


題目描述

  輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。

解題思路
  最好的方法是O(1)空間複雜度,那些中序遍歷二叉樹的然後使用列表存儲節點的方法就不介紹了。
在這裏插入圖片描述
  根據二叉搜索樹的特點:左結點的值<根結點的值<右結點的值,我們不難發現,使用二叉樹的中序遍歷出來的數據的數序,就是排序的順序。因此,首先,確定了二叉搜索樹的遍歷方法。
  接下來,我們看下圖,我們可以把樹分成三個部分:值爲10的結點、根結點爲6的左子樹、根結點爲14的右子樹。根據排序雙向鏈表的定義,值爲10的結點將和它的左子樹的最大一個結點鏈接起來,同時它還將和右子樹最小的結點鏈接起來。
在這裏插入圖片描述
  按照中序遍歷的順序,當我們遍歷到根結點時,它的左子樹已經轉換成一個排序的好的雙向鏈表了,並且處在鏈表中最後一個的結點是當前值最大的結點。我們把值爲8的結點和根結點鏈接起來,10就成了最後一個結點,接着我們就去遍歷右子樹,並把根結點和右子樹中最小的結點鏈接起來。

實戰

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Convert(self, pRootOfTree):
        # write code here
        if not pRootOfTree:
            return None

        def convertCore(root, last):
            if not root:
                return last
            # 一直遍歷到最左節點
            last = convertCore(root.left, last)
            # 將已排序鏈表最大值節點鏈接到當前節點的左指針
            root.left = last
            # 將已排序鏈表最大值節點的右指針指向當前節點
            if last:
                last.right = root
            # 當前節點加入鏈表中,且是最大值節點
            last = root
            
            last = convertCore(root.right, last)
            
            return last
        
        p = convertCore(pRootOfTree, None)
        while p and p.left:
            p = p.left
        return p
        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章