DS | 折半查找二叉判定树的画法
以下给出我在学习中总结的一种比较简便的 构造折半二叉判定树 的思路以及方法:
思路分析:
在计算 \(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,……\))
因此可以得知,折半查找的二叉判定树 对于所有结点,左子树结点个数<=右子树结点个数。即:
- 若某序列总长 \(n\) 为奇数,左右子树结点个数相等;
- 若某序列总长 \(n\) 为偶数,左字数结点个数=右子树结点个数 -1 .
换句话说,对判定树中所有结点都有:
(左子树结点数-右子树结点数== -1)||(左子树结点数-右子树结点数 == 0)
由此给定某个序列,构建折半查找判定树方法如下三步:
- 按照结点总数先画出最大的满二叉树结构,并计算剩余几个结点。
- 将剩余结点按照上述的规律依次填入最底层即为二叉判定树的树形。
- 将给定序列依次按照 中序遍历 顺序填入各个结点。
具体如下面的例子:
例:画出(\(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 | 折半查找二叉判定树的画法的更多相关文章
- [数据结构]二叉搜索树(BST) VS 平衡二叉排序树(AVL) VS B树(平衡多路搜索树) VS B+树 VS 红黑树(平衡二叉B树)
1 二叉排序树/二叉查找树/Binary Sort Tree 1种对排序和查找都很有用的特殊二叉树 叉排序树的弊端的解决方案:平衡二叉树 二叉排序树必须满足的3条性质(或是具有如下特征的二叉树) 若它 ...
- 【转载】区间信息的维护与查询(一)——二叉索引树(Fenwick树、树状数组)
在网上找到一篇非常不错的树状数组的博客,拿来转载,原文地址. 树状数组 最新看了一下区间的查询与修改的知识,最主要看到的是树状数组(BIT),以前感觉好高大上的东西,其实也不过就这么简单而已. 我们有 ...
- 二叉索引树BIT
定义 二叉索引树,binary index tree,又名树状数组,或Fenwick Tree,因为本算法由Fenwick创造. 对于数组A,定义Query(i,j) = Ai +Ai ...
- C++实用数据结构:二叉索引树
看下面这个问题(动态连续和查询): 有一个数组A(长度为n),要求进行两种操作: add(i,x):让Ai增大x: query(a,b):询问Aa+Aa+1+...+Ab的和: 若进行模拟,则每次qu ...
- POJ 3321 Apple Tree dfs+二叉索引树
题目:http://poj.org/problem?id=3321 动态更新某个元素,并且求和,显然是二叉索引树,但是节点的标号不连续,二叉索引树必须是连续的,所以需要转化成连续的,多叉树的形状已经建 ...
- NYOJ 116 士兵杀敌(二)(二叉索引树)
http://acm.nyist.net/JudgeOnline/problem.php?pid=116 题意: 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的 ...
- HDU 1166 敌兵布阵(线段树 or 二叉索引树)
http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意:第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N<=50000),表示敌人有 ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
- ACNet: 特别的想法,腾讯提出结合注意力卷积的二叉神经树进行细粒度分类 | CVPR 2020
论文提出了结合注意力卷积的二叉神经树进行弱监督的细粒度分类,在树结构的边上结合了注意力卷积操作,在每个节点使用路由函数来定义从根节点到叶子节点的计算路径,结合所有叶子节点的预测值进行最终的预测,论文的 ...
- 数据结构与算法16—平衡二叉(AVL)树
我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度O(log2n)同时也由此而决定.但是,在某些极端的情况下(如在 ...
随机推荐
- 在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序
独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同 ...
- Educational Codeforces Round 101 (Rated for Div. 2) E - A Bit Similar
题目传送门 很巧妙的一道题.对于一个 \(n\)位的 \(01\)字符串,一共有 \(2^n\)种不同字符排列,对于任意一个固定排列,在 \(2^n\)种排列中只有一种排列与该固定排列处处不等,而题干 ...
- 2018CCPC桂林 A(贪心,思维)
题目 分析:首先发现将大的数放在小的数前面结果更优,于是想到通过比较元素大小的方式将两个数组合并,大的放前面小的放后面,但很容易就能想到比这样合并更优的方案.一开始我是想先按这种方式进行合并,然后将最 ...
- 通信技术 Communication
缩写 全称 翻译 备注 I2C Inter-Integrated Circuit 集成电路总线 通信协议 SPI Serial Peripheral Interface 串行外设接口 通信协议 QSP ...
- [ABC261A] Intersection
Problem Statement We have a number line. Takahashi painted some parts of this line, as follows: Firs ...
- k8s安装网络插件calico出现error validating "calico.yaml": error validating data: invalid object to validate; if you choose to ignore these errors, turn validation off with --validate=false
解决办法:使用下面版本的calico curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
- 如何利用烛龙和谷歌插件优化CLS(累积布局偏移)
简介 CLS 衡量的是页面的整个生命周期内发生的每次意外布局偏移的最大突发性_布局偏移分数_.布局变化的发生是因为浏览器倾向于异步加载页面元素.更重要的是,您的页面上可能存在一些初始尺寸未知的媒体元素 ...
- 文心一言 VS 讯飞星火 VS chatgpt (159)-- 算法导论12.3 6题
六.用go语言,当 TREE-DELETE 中的结点 z 有两个孩子时,应该选择结点 y 作为它的前驱,而不是作为它的后继.如果这样做,对 TREE-DELETE 应该做些什么必要的修改?一些人提出了 ...
- 聊一聊 C# 线程切换后上下文都去了哪里
一:背景 1. 讲故事 总会有一些朋友是不是问一个问题,在 Windows 中线程做了上下文切换,请问被切的线程他的寄存器上下文都去了哪里?能不能给我挖出来?这个问题其实比较底层,如果对操作系统没有个 ...
- Scrapy如何在启动时向爬虫传递参数
高级方法: 一般方法: 运行爬虫时使用-a传递参数 scrapy crawl 爬虫名 -a key=values 然后在爬虫类的__init__魔法方法中获取kwargs class Bang123S ...