树与二叉树
文章平均质量分 60
树与二叉树
hnjzsyjyj
这个作者很懒,什么都没留下…
展开
-
AcWing 1254:找树根和孩子
本题是树的遍历问题,不是二叉树。原创 2024-07-02 23:35:26 · 332 阅读 · 0 评论 -
AcWing 1256:扩展二叉树
扩展二叉树的前序遍历相当于普通二叉树的“前序+中序”,能唯一确定二叉树的形状;扩展二叉树的后序遍历相当于普通二叉树的“后续+中序”,能唯一确定二叉树的形状。原创 2024-07-02 22:27:27 · 238 阅读 · 0 评论 -
AcWing 1476:数叶子结点 ← dfs
● 如何判断一个点是否为叶子结点?若一个点的儿子数为 0,则该点为叶子结点。● 如何计算某一层有几个叶子结点?应该从该层的上一层入手,将上一层的所有点进行 DFS 扩展即可得到该层的所有点。原创 2024-07-01 11:21:45 · 275 阅读 · 0 评论 -
AcWing 1261:查找二叉树 ← dfs
链式前向星代码中的数组是要理解的核心。它们的含义弄清楚了,理解链式前向星将会 So easy!(1)val[idx]:存储编号为 idx 的边的值(2)e[idx]:存储编号为 idx 的结点的值(3)ne[idx]:存储编号为 idx 的结点指向的结点的编号(4)h[a]:存储头结点 a 指向的结点的编号原创 2024-06-03 21:44:12 · 534 阅读 · 0 评论 -
洛谷 B3642:二叉树的遍历 ← 结构体方法 & 链式前向星方法
/*val[idx]:存储编号为 idx 的边的值e[idx]:存储编号为 idx 的结点的值ne[idx]:存储编号为 idx 的结点指向的结点的编号h[a]:存储头结点 a 指向的结点的编号*/原创 2024-05-31 22:14:13 · 318 阅读 · 0 评论 -
AcWing 3537:树查找 ← 完全二叉树性质
● 完全二叉树的第 k 层(k≥1)最多有 2^(k-1) 个结点,即 1原创 2024-05-31 18:08:03 · 338 阅读 · 0 评论 -
UOJ 763:树哈希 ← 链式前向星
● shift 函数:shift 函数是一个将哈希值向左或向右移动特定位数的操作。在某些哈希算法中,这是一个常见的步骤。具体的 shift 函数实现会根据所使用的哈希算法而变化。● 从代码易见,去重函数 unique使用之前,需利用 sort 对数据进行排序。原创 2024-05-30 18:58:57 · 594 阅读 · 0 评论 -
AcWing 476:对称二叉树
基本思路:(1)以二叉树的每一个结点为根结点,寻找对称二叉树。(2)统计找到的对称二叉树的结点数。(3)比较获得最大的结点数。原创 2024-05-30 11:44:47 · 272 阅读 · 0 评论 -
AcWing 1600:完全二叉树
● 树的结点编号为 0∼N−1,而1≤N≤20,所以结点编号是有二位数的,编码时要注意处理。● 字符 ‘0’~‘9’ 转数字。例如,利用 ‘9’-‘0’ 得到数字 9。其他以此类推。原创 2024-05-29 17:22:48 · 436 阅读 · 0 评论 -
AcWing 2568:树链剖分 ← 线段树+DFS
重儿子/轻儿子:结点个数最多的子树的根结点称为当前结点的重儿子,其他子结点称为当前结点的轻儿子。若当前结点存在多个结点个数相同的子树,则任选一个子树的根结点作为当前结点的重儿子。故易知每个结点的重儿子是唯一的。重边/轻边:重儿子与父结点之间的边,称为重边。其他边称为轻边。重链:重边构成的极大路径,称为重链。DFS序:深度优先遍历树的重儿子,可保证树中各条重链结点的编号是连续的。此性质保证了树链剖分后各区间是连续的。原创 2024-05-28 22:13:38 · 908 阅读 · 0 评论 -
AcWing 3555:二叉树(北京大学考研机试题)→公共父结点
对于一个二叉树,定义当前节点的编号为 i(从 1 开始),那么它的左子节点为 2*i,右子节点是2*i+1。故寻找两个节点的公共父节点,可以让其分别除以2,直到两个节点指向同一个位置。原创 2023-11-29 14:59:36 · 392 阅读 · 0 评论 -
AcWing 3555:二叉树(多次询问两个结点之间的最短路径长度) ← DFS
本题用 le,ri 数组存储每个结点的左右儿子,用 fa 数组表示子结点的父节点,用 dep 数组表示每个结点的深度并用 dfs 初始化每个结点的深度。原创 2023-11-29 11:32:42 · 153 阅读 · 0 评论 -
AcWing 3384:二叉树遍历(依先序序列建树,输出中序序列) ← DFS
本题是按输入的先序遍历序列建树,然后输出对应的中序遍历序列。原创 2023-11-24 11:26:54 · 123 阅读 · 0 评论 -
Huffman 编码
Huffman coding is a lossless data compression algorithm. The idea is to assign variable-length codes to input characters, lengths of the assigned codes are based on the frequencies of corresponding characters.原创 2023-11-04 08:17:12 · 127 阅读 · 0 评论 -
AcWing 148:合并果子 ← 贪心算法、Huffman树
利用优先队列 priority_queue Q; 来模拟计算 Huffman 树的WPL值。原创 2023-11-03 10:34:54 · 84 阅读 · 0 评论 -
P2168 [NOI2015] :荷马史诗 ← k叉 Huffman 树
通常的哈夫曼树是二叉树,但实际上哈夫曼树也可以是k叉的。构造k叉哈夫曼树的思想是每次选k个权重最小的结点来合成一个新的结点。若满足(n−1)%(k−1)==0,则不需补0结点,否则需补0结点。例如,n=6,k=3时,不满足(n−1)%(k−1)==0。但n=7时满足(n−1)%(k−1)==0,则需补7-6=1个0结点。原创 2023-11-04 09:56:51 · 188 阅读 · 0 评论 -
查找:B-树 ← PPT
查找:B-树 ← PPT原创 2023-10-11 23:34:30 · 90 阅读 · 0 评论 -
AcWing 4310:树的DFS ← vector、auto、邻接表
-对于一棵树的DFS序列而言,每棵子树的DFS序列对应其中的连续一段。-树可视为没有环的“有向无权图”。故可借鉴利用STL中的vector实现“有向无权图”的邻接表表示存图的代码实现存树。原创 2023-08-05 11:54:42 · 352 阅读 · 0 评论 -
洛谷:P5018 对称二叉树 ← NOIP2018 普及组T4
洛谷:P5018 对称二叉树 ← NOIP2018 普及组T4原创 2023-07-11 12:00:58 · 180 阅读 · 0 评论 -
unordered_map 浅析
若要使用unordered_map,必须使用支持C++ 11标准的编译器。原创 2023-07-09 22:45:28 · 179 阅读 · 0 评论 -
由中序及后序遍历序列构建二叉树的函数参数解析
∵ x-ple=k-1-ile ∴ x=ple+k-1-ile, y=ple+k-1-ile+1ile:中序遍历左端点位置,iri:中序遍历右端点位置ple:后序遍历左端点位置,pri:后序遍历右端点位置原创 2023-07-09 22:35:46 · 261 阅读 · 0 评论 -
AcWing 1497:树的遍历
二叉树构建函数的参数确立示意图ile:中序遍历左端点位置,iri:中序遍历右端点位置ple:后序遍历左端点位置,pri:后序遍历右端点位置∵ x-ple=k-1-ile ∴ x=ple+k-1-ile, y=ple+k-1-ile+1原创 2023-07-09 22:24:04 · 171 阅读 · 1 评论 -
北京大学考研机试题:二叉树
遇到二叉树的问题,不一定要去建树。通过分析,二叉树的问题就可能就转化为简单的数值计算问题。原创 2023-07-09 12:01:59 · 961 阅读 · 0 评论 -
替罪羊树 ← 洛谷P3369、AcWing253
替罪羊树(Scapegoat Tree),作为最简单的一种维护二叉树平衡的BST,采用简单而暴力的“摧毁、重建”方法维护二叉树的平衡:1.若二叉树的某棵子树不平衡了,先求得这棵子树的中序遍历序列,然后再删除这棵子树。谓之“摧毁”。2.以第1步得到的中序遍历序列的中间元素为根,构建一棵平衡的子树。谓之“重建”。原创 2023-01-11 17:23:53 · 375 阅读 · 0 评论 -
完全二叉树的权值 ← 蓝桥杯
完全二叉树的权值 ← 蓝桥杯原创 2022-10-29 16:15:21 · 100 阅读 · 0 评论 -
二叉树的遍历 ← C++实现
本算法改编自严蔚敏《数据结构(C语言版 第2版)》。本算法的输入是将原始二叉树按下图所示补充“#”号后的二叉树的先序序列ABD#G###CE##F##。特别提醒,本算法中的先序遍历、中序遍历、后序遍历函数的递归写法,特别清晰简洁。原创 2022-10-12 21:03:42 · 379 阅读 · 0 评论 -
P1087 [NOIP2004 普及组第三题] FBI 树
FBI树是一种二叉树,它的结点类型包括F结点,B结点和I结点三种。原创 2022-07-17 15:55:17 · 660 阅读 · 0 评论 -
利用STL中的vector实现“树”
【算法分析】树和图有什么联系?在示意图层面,树其实就是不包含回路的无向连通图。在代码层面,树就是利用STL中的vector实现的“有向无权图”。(注意:“树”的“有向性”,体现在结点间明显的父子关系)【程序代码】#include <bits/stdc++.h>using namespace std;const int N = 1e5;vector<int> v[N];int main() { int n,m; //n点数,m边数 cin>&g原创 2020-09-17 23:28:29 · 1815 阅读 · 1 评论 -
AcWing 3598:二叉树遍历 ← 依据二叉树的先序遍历和中序遍历求其后序遍历
分治法 → 详见示意图进行遍历代码编写原创 2021-07-26 15:16:11 · 2545 阅读 · 3 评论 -
依据二叉树的中序遍历和层次遍历求其先序遍历
【问题描述】树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。【输入格式】两行,每行是由大写字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。【输出格式】一行,表示二叉树的先序序列。【数据范围】输入字符串的长度均不超过26。【输入样例】DBEACABCDE【输出样例】ABDEC【算法代码】#i原创 2021-07-26 17:01:35 · 1851 阅读 · 0 评论 -
编程求完全二叉树的叶子结点数
【问题描述】已知一棵完全二叉树的总结点数为n,编程求它的叶子结点数n0。【输入格式】完全二叉树的总结点数n【输出格式】完全二叉树的总结点数n0【输入样例】1001【输出样例】501【算法分析】设完全二叉树的总结点数为n,叶子结点数为n0,单分支结点数为n1,双分支结点数为n2,则有:n=n0+n1+n2又因为二叉树有性质:n0=n2+1两式子联立得:n0=(n+1-n1)/2由于完全二叉树的单分支结点数n1要么为0,要么为1。所以,当n为偶数时,n1必须为1,才能保证n0为整数。等价于当n原创 2021-07-26 22:40:14 · 1176 阅读 · 0 评论 -
判断是否是完全二叉树?
【问题描述】给定一个树,请你判断它是否是完全二叉树。【输入格式】第一行包含整数 N,表示树的结点个数。树的结点编号为 0∼N−1。接下来 N 行,每行对应一个结点,并给出该结点的左右子结点的编号,如果某个子结点不存在,则用 - 代替。【输出格式】如果是完全二叉树,则输出 YES 以及最后一个结点的编号。如果不是,则输出 NO 以及根结点的编号。【数据范围】1≤N≤20【输入样例1】97 8- -- -- -0 12 34 5- -- -【输出样例1】YES 8【输入样例2原创 2021-07-27 23:17:13 · 310 阅读 · 2 评论 -
小米2017秋招真题:二叉树的高度
【题目描述】现在有一棵合法的二叉树,树的节点都是用数字表示,现在给定这棵树上所有的父子关系,求这棵二叉树的高度。【输入描述】输入的第一行表示节点的个数n(1 ≤ n ≤ 1000,节点的编号为0到n-1)组成,下面是n-1行,每行有两个整数,第一个数表示父节点的编号,第二个数表示子节点的编号。【输出描述】输出树的高度,为一个整数。【输入样例】50 10 21 31 4【输出样例】3【算法代码】#include <bits/stdc++.h>using namespace原创 2021-08-01 16:02:22 · 125 阅读 · 1 评论 -
层序构建二叉树后求其深度
【问题描述】输入二叉树的层序遍历序列(空子树用#补全),求二叉树的深度。【测试样例】层序构建二叉树的测试样例序列分别为【8 3 2 # # 6 4 # # # #】,【D A # R # E # # N # #】,对应的图分别如下所示:【算法分析】二叉树的问题一般会用递归的思想去考虑,因为二叉树是递归的结构。此题的关键是层序构建二叉树的代码。输入样例后,回车。按Ctrl+Z输出结果。【算法代码】#include <bits/stdc++.h>using nam...原创 2021-08-01 21:12:28 · 146 阅读 · 0 评论 -
京东2019笔试题:紧急疏散 ← 链式前向星
val[idx] 表示第 idx 条边的权值。e[idx] 表示第 idx 条边的终点。ne[idx] 表示与第 idx 条边同起点的最近一次被添加的边的编号。h[a] 表示以结点 a 为起点的最近一次被添加的边的编号。这个表述是在使用ne[idx]=h[a] 时,也即使用h[a]=idx++ 更新 h[a] 之前而言的。要特别注意这个语境。原创 2021-08-25 12:53:53 · 160 阅读 · 0 评论 -
树的重心 ← STL及链式前向星两种实现
h[a]:存储单链表表头结点 a 的编号e[idx]:存储结点 idx 的值ne[idx]:存储结点 idx 的下一个结点的编号原创 2021-08-25 15:20:29 · 232 阅读 · 1 评论 -
树的高度 ← 链式前向星
h[a]:存储单链表表头结点 a 的编号e[idx]:存储结点 idx 的值ne[idx]:存储结点 idx 的下一个结点的编号原创 2021-08-27 11:34:24 · 194 阅读 · 1 评论 -
哈夫曼树(Huffman Tree) ← 优先队列priority_queue
【问题描述】题目来源:https://www.acwing.com/problem/content/3534/给定 N 个权值作为 N 个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为 WPL。WPL示例如下:【输入格式】第一行包含整数 N,表示叶子结点数量。第二行包含 N 个整数,表示每个叶子结点的权值。【输出格式】输出一个整数,表示生成哈夫曼树.原创 2021-10-12 23:35:28 · 435 阅读 · 1 评论 -
求证:具有 n 个结点的完全二叉树的深度为......
求证:具有 n 个结点的完全二叉树的深度为⌊log2n⌋+1 或⌈log2(n+1)⌉ 。证明:设完全二叉树的深度为h,则依据“深度为h的二叉树至多有2h-1个结点(h≥1)”的性质,可得:2^(h-1)-1<n ≤ 2^h-1其等价于 2^(h-1)<n +1 ≤ 2^h ,也即 2^(h-1) ≤ n<2^h● 对式子 2^(h-1)<n +1 ≤ 2^h 求对数,可得 (h-1)<log2(n +1) ≤ h显然,此时完全二叉树的深度h=⌈log2(n+1)⌉● 对式子 2^(h-1) ≤原创 2021-10-14 00:01:56 · 13271 阅读 · 3 评论