二叉搜尋樹的查詢 插入 刪除

2021-10-09 17:38:35 字數 4491 閱讀 6225

# -*- coding:utf-8 -*-

# @time : 2020/9/23 15:56

# @author: julyli

# @file : bst.py

class

bitreenode

:def

__init__

(self, data)

: self.data = data

self.lchild =

none

self.rchild =

none

self.parent =

none

"""刪除操作:

1.如果要刪除的節點葉子節點:直接刪除

2.如果要刪除的節點只有乙個孩子:將節點的父親節點與孩子連線,然後刪除改節點。

3.如果要刪除的節點有兩個孩子:將其右子樹的最小節點(該節點最多有乙個右孩子)刪除,並替換當前節點。

"""class

bst:

def__init__

(self, li=

none):

self.root =

none

if li:

for val in li:

self.insert_no_rec(val)

definsert

(self, node, val)

:# 遞迴寫法

ifnot node:

node = bitreenode(val)

elif val < node.data:

node.lchild = self.insert(node.lchild, val)

node.lchild.parent = node

elif val > node.data:

node.rchild = self.insert(node.rchild, val)

node.rchild.parent = node

return node

definsert_no_rec

(self, val)

:# 非遞迴寫法

p = self.root

ifnot p:

# 空樹

self.root = bitreenode(val)

return

while

true

:if val < p.data:

if p.lchild:

p = p.lchild

else

:# 左子樹不存在

p.lchild = bitreenode(val)

p.lchild.parent = p

return

elif val > p.data:

if p.rchild:

p = p.rchild

else

: p.rchild = bitreenode(val)

p.rchild.parent = p

return

else

:return

defquery

(self, node, val)

:# 遞迴寫法

ifnot node:

return

none

if node.data < val:

return self.query(node.rchild, val)

elif node.data < val:

return self.query(node.lchild, val)

else

:return node

defquery_no_rec

(self, val)

: p = self.root

while p:

if p.data < val:

p = p.rchild

elif p.data > val:

p = p.lchild

else

:return p

return

none

defpre_order

(self, root)

:if root:

print

(root.data, end=

',')

self.pre_order(root.lchild)

self.pre_order(root.rchild)

defin_order

(self, root)

:if root:

self.in_order(root.lchild)

print

(root.data, end=

',')

self.in_order(root.rchild)

defpost_order

(self, root)

:if root:

self.post_order(root.lchild)

self.post_order(root.rchild)

print

(root.data, end=

',')

def__remove_node_1

(self, node)

:# 情況一:node是葉子節點

ifnot node.parent:

self.root =

none

if node == node.parent.lchild:

# node是它父親的左孩子

node.parent.lchild =

none

else

:# 右孩子

node.parent.rchild =

none

def__remove_node_21

(self, node)

:# 情況2.1:node只有左孩子

ifnot node.parent:

# 根節點

self.root = node.lchild

node.lchild.parent =

none

elif node == node.parent.lchild:

node.parent.lchild = node.lchild

node.lchild.parent = node.parent

else

: node.parent.rchild = node.lchild

node.lchild.parent = node.parent

def__remove_node_22

(self, node)

:# 情況2.2:node只有乙個右孩子

ifnot node.parent:

# 根節點

self.root = node.rchild

node.lchild.parent =

none

elif node == node.parent.lchild:

node.parent.lchild = node.rchild

node.rchild.parent = node.parent

else

: node.parent.rchild = node.rchild

node.rchild.parent = node.parent

defdelete

(self, val)

:if self.root:

# 不是空樹

node = self.query_no_rec(val)

ifnot node:

# 不存在

return

false

ifnot node.lchild and

not node.rchild:

# 1.葉子節點

self.__remove_node_1(node)

elif

not node.rchild:

# 2.1只有乙個左孩子

self.__remove_node_21(node)

elif

not node.lchild:

# 2.2只有乙個有孩子

self.__remove_node_22(node)

else

:# 3.兩個孩子都有

min_node = node.rchild

while min_node.lchild:

min_node = min_node.lchild

node.data = min_node.data

# 刪除 min_node

if min_node.rchild:

self.__remove_node_22(min_node)

else

: self.__remove_node_22(min_node)

二叉搜尋樹的插入,查詢,刪除

include using namespace std template class node 預設析構函式 templatenode node template node node t value template class bstree 預設析構 void buildbstree 建立二叉樹 ...

二叉搜尋樹的插入 刪除 查詢

1 若左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2 若右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 3 左 右子樹也分別為二叉排序樹 4 沒有鍵值相等的節點 插入的資料之後要滿足二叉樹的性質1和2,所以要先找到插入位置,且插入的位置一定是在葉子節點的下面 所以插入分兩個步驟 ...

二叉搜尋樹的查詢 刪除 插入

1 include2 3using namespace std 45 二叉搜尋樹 6 typedef struct binode 7binode bitree 這裡面的bitree前面有乙個星星,表示這種結構的指標型別 1314 sousuo 15 這裡的 t代表的是二叉排序樹,key表示的是要查詢...