二叉排序樹的實現(python)

2021-08-03 03:37:00 字數 3498 閱讀 5904

二叉排序樹,又叫二叉搜尋樹,二叉查詢樹。

二叉搜尋樹中比較複雜的就是刪除操作,我的刪除操作寫的最笨了,**比較幼稚,但是對於初學者很容易看懂。看懂了之後再進行優化。因為我也是初學,網上大神的方法看不懂。。。就自己按照操作寫了乙個

想驗證自己寫的對不對,所以又寫了乙個前序遍歷。

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 ...