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