版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tommy1295/article/details/82733768
1. 二叉搜索树
概念:
查找插入与删除操作:
1. 查找
2. 查找最大最小值
3. 插入
4. 删除
5. 具体实现代码如下:
# 节点类建成的二叉树
# 用已经建成的二叉搜索树 实例,作为输入
from queue import Queue
queue = Queue()
class BinTree:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
btree = BinTree(3, BinTree(2, BinTree(1)),
BinTree(7, BinTree(6, BinTree(5))))
# 遍历二叉树
def traversal(btree):
if btree is not None:
queue.put(btree)
while not queue.empty(): # 整体框架如此,但是还有些具体的约束
btree = queue.get()
if btree.data is not None:
print(btree.data)
else:
break
if btree.left is not None:
queue.put(btree.left)
if btree.right is not None:
queue.put(btree.right)
#####################
traversal(btree) # 层次遍历原始搜索树
######################
# 查找函数
def find(btree, x): # 查找功能
while btree:
#print("进来?")
if btree.data == x:
return print("有此节点")
elif x > btree.data:
btree = btree.right
else:
btree = btree.left
print("没有需要找的元素")
# 测试查找功能
#find(btree, 1)
# 插入函数
def insert_(btree, x): # 用递归的方法 去 插入
if x >= btree.data: # 当我往右边走时 >= 号表示相等的数往右边走
if btree.right is not None:
btree = btree.right
else:
btree.right = BinTree(x) # 注意这里是插入节点,而不是单纯的数字
return
else:
if btree.left is not None:
btree = btree.left
else:
btree.left = BinTree(x)
return
insert_(btree, x)
# 测试插入函数
insert_(btree, 0) # 注意这里是插入节点,而不是单纯的数字
# 层次遍历检查是否已经插入
print("插入后的结果是?")
traversal(btree)
# 找到最大值函数
def findmax(btree):
if btree is not None:
while True:
if btree.right is not None:
btree = btree.right
else:
break
print("最大的元素是", btree.data)
return btree
# 删除函数
def delete_(btree, x):
while btree.data is not None: # 算法的一些细节,在改bug的时候发现
print("进来?")
if btree.data == x: # 找到了节点分三种情况
if btree.left is None and btree.right is None:
btree = None
elif btree.left is None and btree. right is not None:
# btree = btree.right # 这样的是错误的引用
btree.data = btree.right.data
btree.left = btree.right.left
btree.right = btree.right.right
elif btree. right is None and btree. left is not None:
print("进入的节点只有左节点")
# btree = btree.left # 这里的引用也将导致错误
# 正确的是:
btree.data = btree.left.data
btree.right = btree.left.right
btree.left = btree.left.left
else:
max_ = findmax(btree) # 找到右子树的最大元素
btree.data = max_.data
print("最大树的左边", max_.left.data)
# max_ = max_.left #注意 这样引用是错误的
max_.data = max_.left.data
max_.left = max_.left.left
max_.right = max_.left.right
elif x > btree.data:
btree = btree.right
if btree is None:
break
else:
btree = btree.left
if btree is None:
break
# 测试删除函数 ;
#delete_(btree, 2)
#traversal(btree) # 层次遍历原始搜索树
6.