折半查找和二叉排序树

1.折半查找和二叉排序树的时间性能分析:

  •  从查找过程看,二叉排序树与二分查找相似。就平均时间性能而言,二叉排序树上的查找和二分查找差不多,但不完全一致;
  • 折半查找的性能分析可以用二叉判定树来衡量,平均查找长度和最大查找长度都是O(logn);
  • 二叉排序树的查找性能与数据的输入顺序有关,最好情况下的平均查找长度与折半查找相同,但最坏情况时,即形成单支树时,其查找长度为O(n)。
  • 折半查找的判定树唯一,而二叉排序树不唯一,相同的关键字其插入顺序不同可能生成不同的二叉排序树。

2.就维护表的有序性而言,二叉排序树无需移动节点,只需修改指针即可完成插入和删除操作,平均执行时间是O(logn)。二分查找的对象是有序顺序表,若有插入和删除结点的操作,所花的代价是O(n)。

3.当有序表是静态查找表时,宜用顺序表作为其存储结构,而采用二分查找实现其查找操作;若有序表是动态查找表,则应选择二叉排序树作为其逻辑结构。

4.折半查找过程所对应的判定树是一棵平衡二叉树:每次把一个数组从中间分割时,总是把数组分为结点数相差最多不超过1的两个子数组,从而使得对应的判定树的两颗子树高度差绝对值不超过1。

  • 33
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
折半查找(Binary Search)和二叉排序树(Binary Search Tree)是两种常用的查找算法。 1. 折半查找算法实现: 折半查找是一种在有序数组中查找指定元素的算法。它的基本思想是将数组分成两部分,然后判断目标元素与中间元素的大小关系,进而确定目标元素在哪一部分中,然后再在该部分中进行查找,如此循环直到找到目标元素或者确定目标元素不存在。 以下是折半查找的算法实现示例: ```python def binary_search(arr, target): low = 0 high = len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 # 目标元素不存在 arr = [5, 14, 18, 21, 23, 29, 31, 35] target = 29 result = binary_search(arr, target) print("小于29的最大关键字值是:", arr[result-1]) # 输出:23 ``` 2. 二叉排序树算法实现: 二叉排序树是一种特殊的二叉树,它的每个节点的左子树的所有节点的值都小于该节点的值,右子树的所有节点的值都大于该节点的值。通过这种特性,可以实现高效的插入和删除操作。 以下是二叉排序树的算法实现示例: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def insert(root, val): if root is None: return TreeNode(val) if val < root.val: root.left = insert(root.left, val) else: root.right = insert(root.right, val) return root def delete(root, val): if root is None: return root if val < root.val: root.left = delete(root.left, val) elif val > root.val: root.right = delete(root.right, val) else: if root.left is None: return root.right elif root.right is None: return root.left else: min_node = find_min(root.right) root.val = min_node.val root.right = delete(root.right, min_node.val) return root def find_min(root): while root.left: root = root.left return root def inorder_traversal(root): if root: inorder_traversal(root.left) print(root.val, end=" ") inorder_traversal(root.right) # 构造二叉排序树 keys = [45, 24, 53, 12, 37, 93, 13] root = None for key in keys: root = insert(root, key) # 删除关键字53和24 root = delete(root, 53) root = delete(root, 24) # 中序遍历二叉排序树 inorder_traversal(root) # 输出:12 13 37 45 93 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值