二叉搜尋樹(binary search tree)是一棵二叉樹,且滿足該節點所有的左孩子都比它小,所有的右孩子都比它大,對搜尋二叉樹的每個節點需要滿足上述條件,如下所示:
為了構建上述二叉搜尋樹,首先跟普通二叉樹一樣,定義節點類:
class
bitreenode
:def
__init__
(self,data)
: self.data=data # 節點的值
self.lchild=
none
# 節點左孩子
self.rchild=
none
#節點右孩子
再建立乙個二叉搜尋樹的類,我們希望能夠給定乙個序列li,可以將序列中的所有值插入樹中形成二叉搜尋樹,因此需要定義乙個插入函式,該函式的引數為節點的值,執行結果是將節點插入樹中。
補充:由於二叉搜尋樹根節點左邊的數都比根節點小,根節點右邊的數都比根節點大,利用數的中序遍歷可以實現對給定序列的排序,即將給定序列轉換成二叉搜尋樹,再中序遍歷,其時間複雜度為o(nlogn)(其中插入乙個節點為o(logn),插入多個節點為o(n))。
上述過程**實現如下:
class
bst:
def__init__
(self, li)
: self.root=
none
for v in li:
#迴圈插入
self.insert(v)
definsert
(self, key)
:#key是準備插入的數
ifnot self.root:
#如果根節點為空
self.root=bitreenode(key)
else
:#根節點不空
p = self.root
while p:
if key
#如果值小於根節點,往左插
if p.lchild:
#如果根節點有左孩子
p = p.lchild
else
:#如果根節點沒有左孩子
p.lchild = bitreenode(key)
break
elif key>p.data:
#如果值大於根節點,往y右插
if p.rchild:
#如果根節點有右孩子
p = p.rchild
else
:#如果根節點沒有右孩子
p.rchild = bitreenode(key)
break
else
:break
defin_order
(self,root)
:# 中序遍歷
if root:
self.in_order(root.lchild)
print
(root.data, end='')
self.in_order(root.rchild)
執行:
if __name__ ==
'__main__'
: tree=bst([5
,4,6
,8,7
,1,9
,2,3
])tree.in_order(tree.root)
結果如下:
對於查詢操作和插入操作類似,如果根節點的值大於查詢的值,就去根節點的左孩子那去找;如果根節點的值小於查詢的值,就去根節點的右孩子那去找;如果根節點的值等於查詢的值,說明找到,return true,未找到 return false。**如下:
def
query
(self, key):if
not self.root:
#如果根節點為空
return
false
else
:#根節點不空
p = self.root
while p:
if p.data < key:
p = p.lchild
elif p.data > key:
p = p.rchild
else
:return
true
return
false
二叉搜尋樹 插入 查詢
宣告 第一次寫二叉搜尋樹,可能會有bug 這棵二叉搜尋樹以中序遍歷的方式輸出,所以插入 儲存的規則也是按照中序遍歷的規則 include using namespace std struct node node root,nil 根節點和乙個空結點 void insert int key else ...
二叉搜尋樹的建立 查詢 插入 刪除
二叉查詢樹最常見的操作是查詢樹中的某個關鍵字,處了普通的search之外,其還能支援minimum maximun successor predecessor等查詢,對於高度為h的樹,它們都可以在o h 時間內完成。給定指向樹根的指標和關鍵字k,要在樹中查詢該關鍵字是否存在,如果存在,返回其指標,否...
二叉樹 二叉搜尋樹建立 插入 刪除 查詢等操作
二叉搜尋樹性質如下 二叉搜尋樹篇 include include struct search tree typedef struct search tree typedef typedef struct search tree typedef stree node 向二叉搜尋樹插入乙個元素 int ...