以下给出我在学习中总结的一种比较简便的 构造折半二叉判定树 的思路以及方法:

思路分析:

在计算 \(mid\) 值时,使用的时 \(mid=(low+high)/2\) 。这里由于 \(mid\) 为 int 类型,自动默认为向下取整,因此对于一个长度为 \(n\) 序列进行划分之后的序列为 (\(0,1,2,……,mid-1\))\(mid\)(\(mid+1,mid+2,……n-1\)),此时出现两种情况:

  • 左子序列长 == 右子序列长 ( \(n=2k+1 k=0,1,2,……\))
  • 左子序列长 == 右子序列长 -1 (\(n=2k k=1,2,3,……\))


因此可以得知,折半查找的二叉判定树 对于所有结点,左子树结点个数<=右子树结点个数。即:

  1. 若某序列总长 \(n\) 为奇数,左右子树结点个数相等;
  2. 若某序列总长 \(n\) 为偶数,左字数结点个数=右子树结点个数 -1 .

换句话说,对判定树中所有结点都有:

(左子树结点数-右子树结点数== -1)||(左子树结点数-右子树结点数 == 0)

由此给定某个序列,构建折半查找判定树方法如下三步:

  1. 按照结点总数先画出最大的满二叉树结构,并计算剩余几个结点
  2. 将剩余结点按照上述的规律依次填入最底层即为二叉判定树的树形。
  3. 将给定序列依次按照 中序遍历 顺序填入各个结点。

具体如下面的例子:

例:画出(\(2,5,7,10,14,15,18,23,35,41,52\))的折半查找判定树。

序列总长度为 \(n=11>2^3-1\) 即二叉判定树为 \(4\) 层,前三层为满二叉树结构,剩余 \(4\) 个结点。

先画出 前三层 结构。

1)插入第一个结点 \(h\)。

\(a\) 的左右子树结点个数相等,所以新的结点应加入 \(a\) 的右子树;再看 \(a\) 的右子树,\(c\) 的左右子树结点个数相等,所以新结点应加入 \(c\) 的右子树;再看 \(c\) 的右子树,\(g\) 的左右子树结点个数相等,所以新结点应加入 \(g\) 的右子树;如图

2)第二个结点 \(i\)。\(a\) 的 左子树结点数 - 右子树结点数 = -1,所以新结点应加入 \(a\) 的左子树(若加入右子树,对于 \(a\) 来说左右子树结点之差 = \(-2\) ,不符合规律);再看 \(a\) 的左子树,\(b\) 的左右子树结点个数相等,所以新结点应加入 \(b\) 的右子树;再看 \(b\) 的右子树,\(e\) 的左右子树结点个数相等,所以新结点应加入 \(e\) 的右子树。如图

3)同理分析,第三个结点应加在如图位置。

4)第四个结点加在如图位置。

得到最终的树形如上图。(字母编号不唯一,后面中序遍历结果会不同)

该二叉树的中序遍历顺序为 \(dkbeiafjcgh\) ,

分别对应 \(2,5,7,10,14,15,18,23,35,41,52\) 。因此将序列一一对应填入树中,即

该树即为此序列的二叉判定树。

做题过程中熟练使用此方法比通过算法模拟来推断二叉判定树的速度要快许多倍。

在平时做题过程中,涉及到需要具体画出二叉判定树的题目,往往结点个数(序列长度)不超过\(2^4-1=15\) 个,即一般为高度不超过4的树,因此可以在练习时将结点个数 \(8-14\) 的所有树形画几遍,就可以很熟练的掌握这个方法。

二叉判定树画出之后便可以对其他具体题目进行分别的计算,如求成功或失败的查找长度、求比较顺序、比较次数等。

DS | 折半查找二叉判定树的画法的更多相关文章

  1. [数据结构]二叉搜索树(BST) VS 平衡二叉排序树(AVL) VS B树(平衡多路搜索树) VS B+树 VS 红黑树(平衡二叉B树)

    1 二叉排序树/二叉查找树/Binary Sort Tree 1种对排序和查找都很有用的特殊二叉树 叉排序树的弊端的解决方案:平衡二叉树 二叉排序树必须满足的3条性质(或是具有如下特征的二叉树) 若它 ...

  2. 【转载】区间信息的维护与查询(一)——二叉索引树(Fenwick树、树状数组)

    在网上找到一篇非常不错的树状数组的博客,拿来转载,原文地址. 树状数组 最新看了一下区间的查询与修改的知识,最主要看到的是树状数组(BIT),以前感觉好高大上的东西,其实也不过就这么简单而已. 我们有 ...

  3. 二叉索引树BIT

    定义     二叉索引树,binary index tree,又名树状数组,或Fenwick Tree,因为本算法由Fenwick创造.     对于数组A,定义Query(i,j) = Ai +Ai ...

  4. C++实用数据结构:二叉索引树

    看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...

  5. POJ 3321 Apple Tree dfs+二叉索引树

    题目:http://poj.org/problem?id=3321 动态更新某个元素,并且求和,显然是二叉索引树,但是节点的标号不连续,二叉索引树必须是连续的,所以需要转化成连续的,多叉树的形状已经建 ...

  6. NYOJ 116 士兵杀敌(二)(二叉索引树)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=116 题意: 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的 ...

  7. HDU 1166 敌兵布阵(线段树 or 二叉索引树)

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N<=50000),表示敌人有 ...

  8. [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析

    本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...

  9. ACNet: 特别的想法,腾讯提出结合注意力卷积的二叉神经树进行细粒度分类 | CVPR 2020

    论文提出了结合注意力卷积的二叉神经树进行弱监督的细粒度分类,在树结构的边上结合了注意力卷积操作,在每个节点使用路由函数来定义从根节点到叶子节点的计算路径,结合所有叶子节点的预测值进行最终的预测,论文的 ...

  10. 数据结构与算法16—平衡二叉(AVL)树

    我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度O(log2n)同时也由此而决定.但是,在某些极端的情况下(如在 ...

随机推荐

  1. 2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums。 它包含 1 到 n 的所有数字,请你返回上升四元组的数目。 如果一个四元组 (i, j, k, l) 满足

    2023-11-22:用go语言,给你一个长度为 n 下标从 0 开始的整数数组 nums. 它包含 1 到 n 的所有数字,请你返回上升四元组的数目. 如果一个四元组 (i, j, k, l) 满足 ...

  2. OPC 协议数据采集

    kepserver   OPC Connectivity Suite 让系统和应用程序工程师能够从单一应用程序中管理他们的 OPC 数据访问 (DA) 和 OPC 统一架构 (UA) 服务器.通过减少 ...

  3. MCube动态化与原生工程结合最佳实践

    跨端动态化开发方案重要性日益凸显,本文对我们团队MCube动态化实践做了总结,为大家提供经验和借鉴. 接入背景 随着我们工程的需求迭代,暴露出了业务需求量大,分端开发和发版更新成本高等痛点,使用H5页 ...

  4. .net 温故知新【16】:Asp.Net Core WebAPI 筛选器

    一.筛选器 通过使用筛选器可在请求处理管道中的特定阶段之前或之后运行代码. 这即是我们经常听到的面向切面编程AOP(Aspect Oriented Programming)技术,AOP通过预编译方式和 ...

  5. Golang实现JAVA虚拟机-运行时数据区

    原文链接:https://gaoyubo.cn/blogs/8ae1f4ca.html 前置 Golang实现JAVA虚拟机-解析class文件 一.运行时数据区概述 JVM学习: JVM-运行时数据 ...

  6. 0X01 位运算笔记

    位运算,经常可以用来处理一些数学或动归方面的问题,通常会在数据范围较小的情况下使用. 为方便起见,一个 \(\mathrm{n}\) 位二进制数从右到左分别为第 \(\mathrm{0 \sim n ...

  7. IPv6规模部署和应用成必然趋势,IPv6监测具有很大市场潜力

    日前,中央网信办.国家发展改革委.工业和信息化部联合印发<深入推进IPv6规模部署和应用2021年工作安排>.这更深入的表明,IPv6规模部署和应用是互联网演进升级的必然趋势,是网络技术创 ...

  8. STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳

    使用STM32CubeMX软件配置STM32F407开发板RTC实现入侵检测和时间戳功能,具体为周期唤醒回调中使用串口输出当前RTC时间,按键WK_UP存储当前RTC时间到备份寄存器,按键KEY_2从 ...

  9. Javac多模块化编译

    转载:原文链接 从SDK9开始,Java支持多模块编译.那么,怎么用javac实现多模块编译呢? 项目介绍 先来看看我们的项目. 首先lib文件夹下是依赖模块,有一个hello模块.hello模块包含 ...

  10. Picker 选择器

    WXML 文件中 <view class="container"> <view> <text>选择器的值: {{pickerValue}}< ...