二叉查詢樹(binary search tree),也稱為二叉搜尋樹、有序二叉樹或排序二叉樹,是指一棵空樹或者具有下列性質的二叉樹:
若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
任意節點的左、右子樹也分別為二叉查詢樹;
沒有鍵值相等的節點。
通常採取二叉鍊錶作為二叉查詢樹的儲存結構(使用佇列儲存)。
#encoding=utf-8
import
queue
class
treenode(object):
def__init__
(self,val):
self.value =val
self.left =none
self.right =none
self.father =none
#定義二叉搜尋樹的各種功能方法
class
bst(object):
def__init__
(self,nodelist):
self.root =none
for node in
nodelist:
self.bfs_insert(node)
#self.bfs_insert(node)中的bfs_insert方法在後面實現。放在建構函式中的目的是將乙個列表生成乙個二叉搜尋樹列表。
#實現插入功能
#第一步:將根節點(self.root)設定成當前位置節點(cur),即從根節點開始遍歷。根節點的父節點(father)初始設定為none。
defbfs_insert(self,node):
father =none
cur =self.root
#第二步:查詢可以插入的位置
#1. 當前位置節點(cur)的值與待插入節點(node)的值相等,返回-1(代表無法進行插入操作)。並將父節點(father)值修改為當前位置節點(cur),代表該節點已經遍歷完成。
while cur !=none:
if cur.value ==node.value:
return -1father =cur
if node.value cur =cur.left
else
: cur =cur.right
node.father =father
if father ==none:
self.root =node
elif node.value father.left =node
else
: father.right =node
defbfs(self):
if self.root ==none:
return
none
retlist =
q =queue.queue()
q.put(self.root)
while q.empty() is
nottrue:
node =q.get()
if node.left !=none:
q.put(node.left)
if node.right !=none:
q.put(node.right)
return
retlist
defbfs_search(self,value):
cur =self.root
while cur !=none:
if cur.value ==value:
return
cur
elif cur.value cur =cur.right
else
: cur =cur.left
return
none
defbfs_delete(self,node):
father =node.father
if node.left ==none:
if father ==none:
self.root =node.right
if node.right !=none:
node.right.father =none
elif father.left ==node:
father.left =node.right
if node.right !=none:
node.right.father =father
else
: father.right =node.right
if node.right !=none:
node.right.father =father
return
'delete successfully
'tmpnode =node.left
while tmpnode.right !=none:
tmpnode =tmpnode.right
tmpnode.right =node.right
if node.right !=none:
node.right.father =tmpnode
if father ==none:
self.root =node.left
node.left.father =none
elif father.left ==node:
father.left =node.left
node.left.father =father
else
: father.right =node.left
node.left.father =father
node =none
return
'delete successfully'if
__name__ == '
__main__':
varlist = [24,34,5,4,8,23,45,35,28,6,29]
nodelist = [treenode(var) for var in
varlist]
bst =bst(nodelist)
(bst.bfs())
node = bst.bfs_search(34)
bst.bfs_delete(node)
(bst.bfs())
node1 = treenode(1)
bst.bfs_insert(node1)
print (bst.bfs())
Python 資料結構與演算法 二叉搜尋樹的實現
class tree 本身自然需要維護根節點 root 用於指向樹的第乙個節點 class tree root noneclass node 每乙個節點都要維護左子樹 右子樹 class node lft none rgt none一棵二叉搜尋樹最為重要的兩個使命是 插入和搜尋,插入最終返回的是當前...
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
演算法筆記 二叉樹,二叉搜尋樹筆記(python)
二叉樹筆記 1.基本概念 1 根節點 2 葉節點 2.樹 圖 鍊錶之間的關係 1 鍊錶是特殊化的樹,例如一棵樹只有左子節點,而沒有右子節點 或者一棵樹只有右子節點,而沒有左子節點。如下圖。3.二叉樹,python定義 class treenode def init self,val self.val...