第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