# -*- 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表示的是要查詢...