《劍指offer》---二叉搜索樹與雙向鏈表
阿新 • • 發佈:2018-06-07
空間 offer 具體步驟 roo list convert 下一個 要求 8K
將其節點保存在列表中。此時列表裏的節點是按照遞增順序排列。再從頭至尾遍歷列表裏的節點,除第一個與最後一個節點外,其它節點的left指針指向列表上一個元素(節點),其right指針指向列表下一個元素(列表)。對於第一個節點,其left指針為None;列表最後一個節點的right指針為None。
本文算法使用python3實現
1. 問題1
1.1 題目描述:
??輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
??時間限制:1s;空間限制:32768K
1.2 思路描述:
??大致思路:按照題目所說,不能開辟新的節點,只能修改原節點的指針。所以可以大致想到,借助python中的列表,先把節點按序放進列表中,再對列表中的節點進行操作。
??具體步驟:
????(1)當二叉搜索樹為空時,返回的雙向鏈表也應該為空。
????(2)當二叉搜索樹只有一個根節點時,直接返回該根節點即可。
????(3)當不滿足以上條件後,先將二叉搜索樹按照中序遍歷
1.3 程序代碼:
(1)方法一
class Solution:
def Convert(self, pRootOfTree):
# 借助列表
# 當二叉搜索樹為空時
if pRootOfTree == None:
return None
# 當二叉搜索樹只有一個根節點時
if pRootOfTree and not pRootOfTree.left and not pRootOfTree.right:
return pRootOfTree
# 當二叉搜索樹含有兩個及以上節點時
preList = []
preList = self.PreOrder(pRootOfTree, preList)
preList[0].left = None
preList[0].right = preList[1 ]
for i in range(1,len(preList)-1):
preList[i].left = preList[i-1]
preList[i].right = preList[i+1]
preList[-1].left = preList[-2]
preList[-1].right = None
head = preList[0]
return head
def PreOrder(self, root, preList):
# 將節點按中序順序保存到列表中
if root == None:
return
self.PreOrder(root.left, preList)
preList.append(root)
self.PreOrder(root.right, preList)
return preList
《劍指offer》---二叉搜索樹與雙向鏈表