Python資料結構之二叉樹查 刪 修

2021-10-05 11:06:22 字數 4288 閱讀 4335

​   一層一層新增資料(層序遍歷原則),使用佇列對結點進行儲存,從左向右增加結點,最終可形成完全二叉樹。

def

add(self, val)

:"""新增樹節點實現完全二叉樹"""

node = node(val)

if self.root is

none

: self.root = node

return

# 使用佇列來實現節點儲存

queue =

[self.root]

while queue:

tmp_node = queue.pop(0)

# 先進先出

# 左子樹

if tmp_node.left_child is

none

: tmp_node.left_child = node

return

else

:# 右子樹

if tmp_node.right_child is

none

: tmp_node.right_child = node

return

else

:

查詢當前結點

查詢結點的父結點

目標:層序遍歷搜尋所查詢的結點,並把其父結點作為返回值返回。

def

get_parent

(self, val)

:"""查詢指定資料的父親結點"""

if self.root.val == val:

# 根節點無父親節點

return

none

# 層序遍歷,尋找節點(佇列)

queue =

[self.root]

while queue:

tmp_node = queue.pop(0)

if tmp_node.left_child and tmp_node.left_child.val == val:

return tmp_node

if tmp_node.right_child and tmp_node.right_child.val == val:

return tmp_node

# 往下一層進行尋找

if tmp_node.left_child:

if tmp_node.right_child:

刪除結點及其子結點

目標:搜尋到所刪除的結點,並且把孩子結點也刪除。

def

del_node

(self, node, val)

:"""刪除節點的同時需要將左右子樹都刪除"""

if node is

none

:return

if node.val == val and node == self.root:

self.root =

none

self.flag =

true

return

# 結點中找的數值,左右結點置空

if node.val == val:

node.left_child =

none

node.right_child =

none

return node.val

# 遍歷

left_part = self.del_node(node.left_child, val)

if left_part:

# 左樹查詢有返回值

node.left_child =

none

# 查詢結點置空

self.flag =

true

right_part = self.del_node(node.right_child, val)

if right_part:

# 右樹查詢有返回值

node.left_child =

none

self.flag =

true

return

none

輸出結果(刪除中間結點1):

刪除前樹結構: 013

7849

256 刪除後樹結構: 025

6

輸出結果(刪除葉子結點9):

刪除前樹結構: 013

7849

256 刪除後樹結構: 013

7842

56

輸出結果(刪除根結點0):

刪除前樹結構: 013

7849

256 刪除後樹結構:

輸出結果(刪除根未知結點):

刪除前樹結構: 013

7849

256 樹中無指定結點!!!

刪除當前結點

目標:只刪除結點,不刪除其孩子結點

def

delete

(self, val)

:"""刪除指定結點"""

if self.root is

none

:return

false

# 得到刪除結點的父親結點

parent = self.get_parent(val)

if parent:

# 得到刪除結點

del_node = parent.left_child if parent.left_child.val == val else parent.right_child

if del_node.left_child is

none

:if parent.left_child.val == val:

parent.left_child = del_node.right_child

else

: parent.right_child = del_node.right_child

del del_node

return

true

elif del_node.right_child is

none

:if parent.left_child.val == val:

parent.left_child = del_node.left_child

else

: parent.right_child = del_node.left_child

del del_node

return

true

else

:# 左右樹都不為空

tmp_pre = del_node

tmp_next = del_node.right_child

if tmp_next.left_child is

none

: tmp_pre.right_child = tmp_next.right_child

tmp_next.left_child = del_node.left_child

tmp_next.right_child = del_node.right_child

else

:while tmp_next.left_child:

# 尋找左子樹

tmp_pre = tmp_next

tmp_next = tmp_next.left_child

tmp_pre.left_child = tmp_next.right_child

tmp_next.left_child = del_node.left_child

tmp_next.right_child = del_node.right_child

if parent.left_child.val == val:

parent.left_child = tmp_next

else

: parent.right_child = tmp_next

del del_node

return

true

else

:return

false

python 實現二叉樹的建立、二叉樹的新增、二叉樹的刪除、二叉樹的修改、二叉樹的查詢、二叉樹的的遍歷 最詳細的二叉樹 增 刪 改 查

資料結構之二叉樹

在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。一般有如下幾種遍歷方法 1 前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。2 中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。3 ...

資料結構之二叉樹

定義 滿足以下條件的就是樹 1.有且僅有乙個特定的稱為根root的結點。2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...

資料結構之二叉樹

來看一下樹的結構 class treenode public treenode string value 首先,為了方便後面看到效果,先手動初始化乙個有4個節點的二叉樹 tree tree new tree treenode root new treenode root treenode node1...