搜索二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 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.

猜你喜欢

转载自blog.csdn.net/Tommy1295/article/details/82733768