二叉排序樹,又叫二叉搜尋樹,二叉查詢樹。
二叉搜尋樹中比較複雜的就是刪除操作,我的刪除操作寫的最笨了,**比較幼稚,但是對於初學者很容易看懂。看懂了之後再進行優化。因為我也是初學,網上大神的方法看不懂。。。就自己按照操作寫了乙個
想驗證自己寫的對不對,所以又寫了乙個前序遍歷。
class node:
def __init__(self,data):
self.data = data
self.lchild = none
self.rchild = none
class bst:
def __init__(self,node_list):
self.root = none
for node in node_list:
self.insert(node)
def search(self,data):
bt = self.root
while bt:
entry = bt.data
if data < entry:
bt = bt.lchild
elif data > entry:
bt = bt.rchild
else:
return entry
return false
def insert(self,data):
bt = self.root
if not bt:
self.root = node(data)
return
while true:
entry = bt.data
if data < entry:
if bt.lchild is none:
bt.lchild = node(data)
return
bt = bt.lchild
elif data > entry:
if bt.rchild is none:
bt.rchild = node(data)
return
bt = bt.rchild
else:
bt.data = data
return
def front_visit(self,root):
if root == none:
return
print(root.data)
self.front_visit(root.lchild)
self.front_visit(root.rchild)
def delete(self,data):
parent, node = none, self.root
if not node:
print("the tree is null")
return false
while node and node.data != data:
parent = node
if data < node.data:
node = node.lchild
else:
node = node.rchild
if not node:
return
if parent != none and parent.lchild == node:
if node.lchild is none and node.rchild is none:
parent.lchild = none
del node
elif node.lchild != none and node.rchild is none:
parent.lchild = node.lchild
del node
elif node.rchild != none and node.lchild is none:
parent.lchild = node.rchild
del node
elif node.rchild != none and node.lchild != none:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
r.lchild = node.lchild
r.rchild = node.rchild
parent.lchild = r
p.rchild = none
del node
elif parent != none and parent.rchild == node:
if node.lchild is none and node.rchild is none:
parent.rchild = none
elif node.lchild != none and node.rchild is none:
parent.rchild = node.lchild
elif node.rchild != none and node.lchild is none:
parent.rchild = node.rchild
elif node.rchild != none and node.lchild != none:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
r.lchild = node.lchild
r.rchild = node.rchild
p.rchild = none
parent.rchild = r
del node
elif parent is none:
r = node.lchild
p = node
while r.rchild:
p = r
r = r.rchild
# return r.data,node.data
r.lchild = node.lchild
r.rchild = node.rchild
p.rchild = none
self.root = r
del node
刪除分四種情況,第一種是刪除葉子節點,就可以直接刪了。第二種是刪除只有乙個孩子的節點,需要將刪除節點的孩子節點補到刪除節點的位置就好了。第三種是刪除有兩個孩子的,有兩種做法,乙個是選擇刪除節點的左子樹的最大值來補上,另乙個是選擇刪除節點的右子樹的最小值來補上。注意需要將最大值的父親的右孩子置為none,或者將最小值的父親的左孩子置為none,還要注意補上的那個節點要繼承上刪除節點的左右孩子和刪除父節點的鏈結。第四種是第三種的特殊情況,就是刪除的節點是root的時候,因為刪除操作除了要記錄刪除節點的資訊外,還要記錄父親節點的資訊。但是root的無父親節點,只需要取左樹最大或者右樹最小的值來補上,然後操作同第三種,最後要將樹的root設定為替換後的節點。要不然這個樹就沒有root了哦。 二叉排序樹實現 Python
定義 二叉排序樹或者是空樹,或者滿足以下性質 若它的左子樹不空,則左子樹上所有節點的值均小於根節點的值 若它的右子樹不空,則右子樹上所有節點的值均大於根節點的值 左右子樹又各是一顆二叉排序樹 注 二叉排序樹的中序遍歷為遞增有序序列 資料結構 class node def init self,valu...
python 二叉排序樹實現
節點 class node def init self,elem self.elem elem self.left none self.right none 二叉排序樹 class binarysearchtree def init self self.root none def is empty ...
python 二叉排序樹
usr bin env python class btnode def init self,data,left,right self.data data self.left left self.right right class btree def init self,root self.root ...