演算法 二叉搜尋樹的python實現

2022-07-31 13:48:21 字數 3435 閱讀 3012

二叉查詢樹(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)

print

(bst.bfs())

node = bst.bfs_search(34)

bst.bfs_delete(node)

print

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