2026/5/21 10:36:49
网站建设
项目流程
福建住房和城乡建设网站,动态视频素材网站,网站证书打印格式不正确,网络工具折半查找判定树是用于描述折半查找过程的二叉树结构。树的根节点为查找区间的中间元素#xff0c;左子树对应前半部分子表#xff0c;右子树对应后半部分子表#xff0c;递归构造形成一棵逻辑上的二叉搜索树。折半查找判定树
树中每个节点代表一次比较的关键字。查找成功时左子树对应前半部分子表右子树对应后半部分子表递归构造形成一棵逻辑上的二叉搜索树。折半查找判定树树中每个节点代表一次比较的关键字。查找成功时查找路径从根到该节点比较次数等于该节点所在的层数根为第1层。查找失败时查找路径走到某个空指针为止比较次数等于路径上经历的内部节点个数即未命中路径上的非叶节点数。查找次数的上限无论查找成功与否最大比较次数不超过判定树的深度。对于 $ n $ 个节点其判定树的深度为⌊log2n⌋1 \lfloor \log_2 n \rfloor 1⌊log2n⌋1这也是最坏情况下所需的比较次数。平均查找长度ASL当 $ n 2^h - 1 $即判定树为满二叉树时在等概率查找成功的条件下ASLbsn1nlog2(n1)−1 ASL_{bs} \frac{n1}{n} \log_2(n1) - 1ASLbsnn1log2(n1)−1当 $ n $ 较大时可近似为ASLbs≈log2(n1)−1 ASL_{bs} \approx \log_2(n1) - 1ASLbs≈log2(n1)−1表明折半查找具有对数级的平均性能。折半查找的适用场景优点时间复杂度为 $ O(\log n) $远优于顺序查找的 $ O(n) $。限制条件要求数据在顺序存储结构中如数组关键字必须有序插入和删除操作代价高需移动大量元素。典型应用适用于静态或准静态数据集例如只读数据库、配置表、频繁查询但极少更新的场景。defbinary_search(arr,target):left,right0,len(arr)-1whileleftright:mid(leftright)//2ifarr[mid]target:returnmid# 查找成功返回索引elifarr[mid]target:leftmid1else:rightmid-1return-1# 查找失败# 示例使用arr[1,3,5,7,9,11,13]target7resultbinary_search(arr,target)print(f目标值{target}在索引{result}ifresult!-1else查找失败)根据给定的有序数组构建折半查找判定树本质是模拟折半查找过程中每次选取中间元素作为根节点并递归地对左右子数组构造左、右子树的过程。最终形成的二叉树即为折半查找判定树。构建步骤选中间元素为根对于当前有序子数组arr[left:right1]取中间位置mid (left right) // 2对应元素arr[mid]作为当前子树的根。递归构建左右子树左子树由arr[left:mid]构成右子树由arr[mid1:right1]构成。终止条件当left right时返回空节点。Python 实现构建判定树并输出结构classTreeNode:def__init__(self,val0):self.valval self.leftNoneself.rightNonedefbuild_binary_search_decision_tree(arr,left0,rightNone):ifrightisNone:rightlen(arr)-1ifleftright:returnNonemid(leftright)//2rootTreeNode(arr[mid])root.leftbuild_binary_search_decision_tree(arr,left,mid-1)root.rightbuild_binary_search_decision_tree(arr,mid1,right)returnroot# 中序遍历查看树结构应保持有序definorder_traversal(root):ifnotroot:return[]returninorder_traversal(root.left)[root.val]inorder_traversal(root.right)# 层序遍历打印树结构更直观defprint_level_order(root):ifnotroot:print(Empty tree)returnfromcollectionsimportdeque queuedeque([root])result[]whilequeue:nodequeue.popleft()ifnode:result.append(node.val)queue.append(node.left)queue.append(node.right)else:result.append(None)# 去掉末尾多余的 Nonewhileresultandresult[-1]isNone:result.pop()print(Level-order traversal:,result)# 示例使用arr[1,3,5,7,9,11,13]rootbuild_binary_search_decision_tree(arr)print(Original array:,arr)print(Inorder traversal:,inorder_traversal(root))# 应与原数组一致print_level_order(root)输出示例Original array: [1, 3, 5, 7, 9, 11, 13] Inorder traversal: [1, 3, 5, 7, 9, 11, 13] Level-order traversal: [7, 3, 11, 1, 5, 9, 13]这棵树的根是 7中间左子树以 3 为根包含 [1,5]右子树以 11 为根包含 [9,13]完全符合折半查找逻辑。注意事项判定树的形状取决于数组长度和中间点选择方式向下取整若 $ n 2^h - 1 $则判定树是一棵满二叉树否则为完全二叉树或近似完全二叉树。