二叉排序樹實現 Python

2021-10-05 18:35:23 字數 3525 閱讀 2410

定義:二叉排序樹或者是空樹,或者滿足以下性質

若它的左子樹不空,則左子樹上所有節點的值均小於根節點的值

若它的右子樹不空,則右子樹上所有節點的值均大於根節點的值

左右子樹又各是一顆二叉排序樹

注: 二叉排序樹的中序遍歷為遞增有序序列

資料結構:

class

node()

: def __init__

(self,value)

: self.value = value

self.left = none

self.right = none

def bst_serach

(root, value)

:if not root: # 遇到空節點,未找到

return false

if root.value == value: # 找到

return true

elif value < root.value: # 若值小於根節點值,繼續從左子樹中查詢

return

bst_serach

(root.left, value)

else

: # 否則,該值大於根節點的值,從右子樹中查詢

return

bst_serach

(root.right, value)

對於乙個不存在於二叉排序樹中的值,其查詢不成功的位置即為該值的插入位置

因此,只需要在找到空指標的時候,進行插入

def bst_insert

(root, value)

:if not root: # 遇到空節點,即為插入位置

root =

node

(value)

return

if root.value == value: # 若該值已存在於二叉樹中,插入失敗

print

("existed!!!"

)return

elif value < root.value: # 若值小於根節點值,繼續從左子樹中查詢插入位置

if not root.left: # 該判斷不可刪除,會出現無法插入的問題,原因尚未知

root.left =

node

(value)

return

bst_insert

(root.left, value)

# 注:以上四句不可用 return self.

bst_insert

(root.right, value)代替,

# 會出現節點無法插入的問題

else

: # 否則,該值大於根節點的值,從右子樹中查詢插入位置

if not root.right:

root.right =

node

(value)

return

bst_insert

(root.right, value)

class

bstree()

: def __init__

(self, root)

: self.root = root

def serach

(self, value)

:return self.

bst_serach

(self.root, value)

def insert

(self, value)

: self.

bst_insert

(self.root, value)

def print_tree

(self)

: self.

bst_print

(self.root)

def bst_insert

(self, root, value)

:if not root: # 遇到空節點,即為插入位置

print

("insert!!!"

) root =

node

(value)

return

if root.value == value: # 若該值已存在於二叉樹中,插入失敗

print

("existed!!!"

)return

elif value < root.value: # 若值小於根節點值,繼續從左子樹中查詢插入位置

if not root.left:

print

("insert!!!"

) root.left =

node

(value)

return

self.

bst_insert

(root.left, value)

else

: # 否則,該值大於根節點的值,從右子樹中查詢插入位置

if not root.right:

print

("insert!!!"

) root.right =

node

(value)

return

self.

bst_insert

(root.right, value)

# 注:以上四句不可用 return self.

bst_insert

(root.right, value)代替

# 會出現節點無法插入的問題

def bst_serach

(self, root, value)

:if not root: # 遇到空節點,未找到

return false

if root.value == value: # 找到

return true

elif value < root.value: # 若值小於根節點值,繼續從左子樹中查詢

return self.

bst_serach

(root.left, value)

else

: # 否則,該值大於根節點的值,從右子樹中查詢

return self.

bst_serach

(root.right, value)

def bst_print

(self, root):""

"middle serach"

""if not root:

return

self.

bst_print

(root.left)

print

(root.value)

self.

bst_print

(root.right)

刪除操作較複雜,暫未編寫

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

二叉排序樹的實現(python)

二叉排序樹,又叫二叉搜尋樹,二叉查詢樹。二叉搜尋樹中比較複雜的就是刪除操作,我的刪除操作寫的最笨了,比較幼稚,但是對於初學者很容易看懂。看懂了之後再進行優化。因為我也是初學,網上大神的方法看不懂。就自己按照操作寫了乙個 想驗證自己寫的對不對,所以又寫了乙個前序遍歷。class node def in...