BST+AVL+SB

BST

性质

左子树<根节点、右子树>根节点

用途

解决排名相关的检索需求

基本操作

插入操作

一直插入到叶子节点

删除操作

1、删除叶子节点:直接删除,并将其父节点的孩子节点置空

2、删除度为1的节点:删除后,将孩子节点挂到父节点的父节点上

3、删除度为2的节点:找到前驱或者后继替换后,转换为度为1的节点

缺点

查找效率依赖于节点的插入顺序

AVL树

二叉排序树可能会退化成链表,时间效率从o(logn)---->o(n)

所以给出了平衡二叉排序树

性质

|h(left) - h(right)| <= 1

高度限制:low(h-2) + low(h-2) + 1 <= size(h) <= 2 ^ h - 1

近似于:1.5^h <= size(h) <= 2^h -1

调整策略

LL型:直接将不平衡的节点右旋

LR型:将不平衡节点的左孩子节点左旋,然后将该节点右旋

RL型:将不平衡节点的右孩子右旋,将该节点左旋

RR型:将不平衡节点左旋

SB树

满足:

size(left) >= size(right->left)、size(left) >= size(right->right);

size(right) >= size(left->left)、size(right) >= size(left->right);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的 Python 示例代码,可用于对比 BSTAVL 和 B 树在相同数据集上搜索的时间: ```python import random import timeit from binary_search_tree import BST from avl_tree import AVLTree from b_tree import BTree # 创建 BSTAVL 和 B 树对象 bst = BST() avl = AVLTree() b_tree = BTree(3) # 生成随机数数据集 data_set = [random.randint(0, 1000000) for _ in range(10000)] # 在 BST 中插入数据 for num in data_set: bst.insert(num) # 在 AVL 树中插入数据 for num in data_set: avl.insert(num) # 在 B 树中插入数据 for num in data_set: b_tree.insert(num) # 随机选取 100 个数字进行搜索 search_nums = random.sample(data_set, 100) # 在 BST 中搜索并计算时间 bst_time = timeit.timeit(lambda: [bst.search(num) for num in search_nums], number=100) # 在 AVL 树中搜索并计算时间 avl_time = timeit.timeit(lambda: [avl.search(num) for num in search_nums], number=100) # 在 B 树中搜索并计算时间 b_tree_time = timeit.timeit(lambda: [b_tree.search(num) for num in search_nums], number=100) # 输出结果 print(f"在 BST 中搜索 100 个数字的时间为:{bst_time:.6f} 秒") print(f"在 AVL 树中搜索 100 个数字的时间为:{avl_time:.6f} 秒") print(f"在 B 树中搜索 100 个数字的时间为:{b_tree_time:.6f} 秒") ``` 请注意,此示例代码假设您已经实现了 BSTAVL 和 B 树的代码,并且已经导入到了当前的 Python 文件中。如果您还没有实现它们的代码,您需要自己编写具体的代码,并在示例中进行相应的更改。 此示例代码将生成一个包含 10000 个随机数的数据集,并将它们插入到 BSTAVL 和 B 树中。然后,它会随机选择 100 个数字进行搜索,并计算每个树在搜索这些数字时所需的时间。最后,它将输出每个树的搜索时间,并让您对它们进行比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值