Python演算法練習--把搜尋樹轉成雙向連結串列
本文目前分享的題目都是來自於July的分享,然後把具體演算法實現。搜尋樹轉雙向連結串列主要的實現邏輯是在中序遍歷時,調整節點的左右子樹;因為中序遍歷是遞迴呼叫,所以在調整時一定要注意調整的位置,如果寫錯了,很有可能造成死迴圈。避免的主要辦法是在讀完左子樹時調整左節點,遍歷完右子樹時調整右節點,具體程式碼見trans函式。演算法的時間複雜度是o(logn)。
輸入樹構建完成後是:
程式碼如下:
# -*- coding: utf-8 -*-
"""
題目:輸入一棵二叉搜尋樹(記住是搜尋樹),將該二叉搜尋樹轉換為一個排序的雙向連結串列。要求:不能建立任何新的結點,只能調整樹中結點指標的指向。
1 2 3 4 5 6 7 輸入順序 4 3 1 2 5 6 7用這個順序建立二叉查詢樹
基本思路:用中序遍歷的方式,每一個節點左側連線的應該是左子數的最右邊一個節點,而右邊連線的應該是右子樹最左邊的節點
"""
class TreeNode:
"""
樹的節點定義,後面的很多操作都是基於節點的
"""
def __init__(self):
"""
定義一個樹的節點,初始狀態左右節點為空
"""
self.leftNode = None
self.rightNode = None
def setData(self, data):
"""
設定數字的方法
args: data節點值
"""
self.data = data
def setLeftNode(self, leftNode):
"""
設定左節點的方法
args: leftNode 左節點
"""
self.leftNode = leftNode
def setRightNode(self, rightNode):
"""
設定右節點的方法
args: rightNode 右節點
"""
self.rightNode = rightNode
def getData(self):
"""
獲取節點數字
return:返回節點數字
"""
return self.data
def getLeftNode(self):
"""
獲取左節點
return:返回左節點
"""
return self.leftNode
def getRightNode(self):
"""
獲取右節點
return:返回右節點
"""
return self.rightNode
class BuildTree:
"""
以輸入順序構建二叉查詢樹,左邊的比根節點小,右側的比根節點大
"""
def build(self, dataList):
"""
開始構建樹
args:dataList 樹的節點值
"""
#遍歷輸入陣列
for i in range(len(dataList)):
currData = dataList[i]
#初始化一個節點
newTreeNode = TreeNode()
newTreeNode.setData(currData);
#如果是一個輸入,則作為樹的根節點
if i==0:
self.tree = newTreeNode
#否則進行大小的比較,構建二叉查詢樹
else:
flagNode = self.tree
while flagNode is not None:
if currData <= flagNode.getData():
#如果當然值小於等於根節點,並且左節點為空的話,則進行左節點賦值
if flagNode.getLeftNode() is None:
flagNode.setLeftNode(newTreeNode)
break;
else:
#否則繼續找左節點
flagNode = flagNode.getLeftNode()
else:
#如果當然值大於根節點,並且右節點為空的話,則進行右節點賦值
if flagNode.getRightNode() is None:
flagNode.setRightNode(newTreeNode)
break;
else:
#否則繼續找右節點
flagNode = flagNode.getRightNode()
def trans(self, tempNode):
"""
遞迴進行中序遍歷
在左子樹遍歷完時,找左子樹最右邊的節點,做為節點的左子樹
在右子樹遍歷完時,找左子樹最右變的節點,做為節點的右子樹
args:tempNode 初始為樹的根節點
"""
if tempNode is not None:
#遞迴遍歷左子樹
self.trans(tempNode.getLeftNode())
#左子樹遍歷完成,進行左側最右節點的查詢
if tempNode.getLeftNode() is not None:
tempNode2 = tempNode.getLeftNode()
while tempNode2.getRightNode() is not None:
tempNode2 = tempNode2.getRightNode()
tempNode.setLeftNode(tempNode2)
tempNode2.setRightNode(tempNode)
#遞迴遍歷右子樹
self.trans(tempNode.getRightNode())
#右子樹遍歷完成,進行右側最左節點的查詢
if tempNode.getRightNode() is not None:
tempNode2 = tempNode.getRightNode()
while tempNode2.getLeftNode() is not None:
tempNode2 = tempNode2.getLeftNode()
tempNode.setRightNode(tempNode2)
tempNode2.setLeftNode(tempNode)
def callTrans(self):
"""
用根節點對trans進行呼叫
"""
self.trans(self.tree);
def test(self):
"""
進行資料的測試,分別從左到右讀和從右到左讀取資料
"""
tempNode = self.tree
while tempNode.getLeftNode() is not None:
#找到最左節點
tempNode = tempNode.getLeftNode()
#print tempNode.getData()
#從左向右讀
while tempNode.getRightNode() is not None:
print tempNode.getData()
tempNode = tempNode.getRightNode()
print tempNode.getData()
#從右向左讀
while tempNode is not None:
print tempNode.getData()
tempNode = tempNode.getLeftNode()
if __name__ == "__main__":
#初始化陣列
dataList = [10,6,4,8,2,5,7,9,20,15,28,14,16,24,29]
test = BuildTree()
#構建排序數
test.build(dataList)
#遞迴構建雙向連結串列
test.callTrans()
#測試輸出
test.test()
輸出結果:
2 4 5 6 7 8 9 10 14 15 16 20 24 28 29 29 28 24 20 16 15 14 10 9 8 7 5 4 2
歡迎關注訂閱號“白話演算法”
相關文章
- 【連結串列問題】打卡10:將搜尋二叉樹轉換成雙向連結串列二叉樹
- JZ-026-二叉搜尋樹與雙向連結串列
- 面試題36:二叉搜尋樹與雙向連結串列面試題
- 466. 使用快慢指標把有序連結串列轉換二叉搜尋樹指標
- 連結串列-雙向連結串列
- LeetCode 109——有序連結串列轉化二叉搜尋樹LeetCode
- 結構與演算法(03):單向連結串列和雙向連結串列演算法
- 連結串列-雙向通用連結串列
- 雙向連結串列
- LeetCode-109-有序連結串列轉換二叉搜尋樹LeetCode
- LeetCode系列之「有序連結串列轉換二叉搜尋樹」LeetCode
- 連結串列-雙向非通用連結串列
- python演算法與資料結構-雙向連結串列(40)Python演算法資料結構
- LVGL雙向連結串列學習筆記筆記
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 資料結構-雙向連結串列(Python實現)資料結構Python
- 實現雙向連結串列
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- 資料結構——雙向連結串列資料結構
- DoublyLinkedList(雙向連結串列)——Javascript版JavaScript
- Go實現雙向連結串列Go
- java實現雙向連結串列Java
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構之雙向連結串列資料結構
- 反轉連結串列系列題練習遞迴遞迴
- 雙向連結串列 尾節點插入
- 【c# .net】雙向連結串列( LinkedList )C#
- 反轉連結串列、合併連結串列、樹的子結構
- 連結串列 - 單向連結串列
- 畫江湖之資料結構【第一話:連結串列】雙向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 雙向連結串列資料結構
- Hash連結串列轉換為紅黑樹,和樹轉換為連結串列的條件
- 雙向連結串列的功能實現(初版
- LeetCode刷題記63-109. 有序連結串列轉換二叉搜尋樹【檢視解法】LeetCode
- 雙向連結串列————查詢、刪除、插入結點
- 資料結構(雙向連結串列的實現)資料結構
- 資料結構與演算法(三) -- 線性表之雙向連結串列資料結構演算法