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

思路分析:

在计算 \(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. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-31-JavaScript的调用执行-上篇

    1.简介 在做web自动化时,有些情况playwright的api无法完成以及无法应对,需要通过或者借助第三方手段比如js来完成实现,比如:去改变某些元素对象的属性或者进行一些特殊的操作,本文讲解pl ...

  2. Python根据输入的公司编号、名称、网址,格式化输出公司信息。其中1)冒号统一为英文冒号,编号占6位,不足6位的前面补0。编号后面是制表符。

    根据输入的公司编号.名称.网址,格式化输出公司信息.其中 1)冒号统一为英文冒号,编号占6位,不足6位的前面补0.编号后面是制表符. 2)"公司名称:" 后面输出字符串占8位,左对 ...

  3. JS文本换行算法-模拟计算文字换行位置-基于DOM元素自发换行行为和字符分割原理-支持实体编码、不支持标签嵌套和富文本

    简介之前在学习HTML的时候一直很想弄清楚HTML内部换行的逻辑,特别是有时候我们想知道一个字符串放入一个DOM元素之后究竟在哪个字符位发生的换行,然后就可以知道在一个固定宽高且隐藏溢出的容器中当前用 ...

  4. [CF1034C] Region Separation

    题目描述 There are $ n $ cities in the Kingdom of Autumn, numbered from $ 1 $ to $ n $ . People can trav ...

  5. 2023 年最后一波工具安利「GitHub 热点速览」

    2023 年还有两周就要接近尾声了,2023 年的热点速览还有一波工具好安利:比如上周推荐之后上了热榜的远程调试工具 page-spy-web,让调试像呼吸一般自然方便:还有轻量级的搜索引擎 oram ...

  6. Oracle-lsnrctl监听进程控制

    LSNRCTL> help The following operations are available An asterisk (*) denotes a modifier or extend ...

  7. OpenSSL命令总结

    OpenSSL命令总结 疑今者察之古,不知来者视之往. 导航 介绍 对称加密 公钥加密 信息摘要 数字证书 杂项 介绍 密码学标准和互联网协议一样,是一种大家都遵守的约定和标准,比如PKCS#1中规定 ...

  8. 【Python】【OpenCV】OCR识别(二)——透视变换

    对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的. 针对上述情况,所以我们在处理有角度的图象 ...

  9. 常用的 SQL

    只知道字段名字查找表 SELECT table_name FROM information_schema.columns WHERE column_name = '字段名'; 查看不等于NULL的数据 ...

  10. 听6位专家畅谈AI大模型落地实践:场景和人才是关键

    本文分享自华为云社区<听6位专家畅谈AI大模型落地实践:场景和人才是关键>,作者:华为云社区精选. 随着人工智能技术的不断突破,越来越多的行业开始应用AI技术来提高效率.降低成本.改善用户 ...