树与二叉树
文章平均质量分 57
树与二叉树
hnjzsyjyj
这个作者很懒,什么都没留下…
展开
-
AcWing 3555:二叉树(北京大学考研机试题)→公共父结点
对于一个二叉树,定义当前节点的编号为 i(从 1 开始),那么它的左子节点为 2*i,右子节点是2*i+1。故寻找两个节点的公共父节点,可以让其分别除以2,直到两个节点指向同一个位置。原创 2023-11-29 14:59:36 · 385 阅读 · 0 评论 -
AcWing 3555:二叉树(多次询问两个结点之间的最短路径长度) ← DFS
本题用 le,ri 数组存储每个结点的左右儿子,用 fa 数组表示子结点的父节点,用 dep 数组表示每个结点的深度并用 dfs 初始化每个结点的深度。原创 2023-11-29 11:32:42 · 146 阅读 · 0 评论 -
AcWing 3384:二叉树遍历(依先序序列建树,输出中序序列) ← DFS
本题是按输入的先序遍历序列建树,然后输出对应的中序遍历序列。原创 2023-11-24 11:26:54 · 98 阅读 · 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 · 120 阅读 · 0 评论 -
AcWing 148:合并果子 ← 贪心算法、Huffman树
利用优先队列 priority_queue Q; 来模拟计算 Huffman 树的WPL值。原创 2023-11-03 10:34:54 · 76 阅读 · 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 · 144 阅读 · 0 评论 -
查找:B-树 ← PPT
查找:B-树 ← PPT原创 2023-10-11 23:34:30 · 85 阅读 · 0 评论 -
AcWing 4310:树的DFS ← vector、auto、邻接表
-对于一棵树的DFS序列而言,每棵子树的DFS序列对应其中的连续一段。-树可视为没有环的“有向无权图”。故可借鉴利用STL中的vector实现“有向无权图”的邻接表表示存图的代码实现存树。原创 2023-08-05 11:54:42 · 344 阅读 · 0 评论 -
洛谷:P5018 对称二叉树 ← NOIP2018 普及组T4
洛谷:P5018 对称二叉树 ← NOIP2018 普及组T4原创 2023-07-11 12:00:58 · 137 阅读 · 0 评论 -
unordered_map 浅析
若要使用unordered_map,必须使用支持C++ 11标准的编译器。原创 2023-07-09 22:45:28 · 167 阅读 · 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 · 245 阅读 · 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 · 162 阅读 · 1 评论 -
北京大学考研机试题:二叉树
遇到二叉树的问题,不一定要去建树。通过分析,二叉树的问题就可能就转化为简单的数值计算问题。原创 2023-07-09 12:01:59 · 953 阅读 · 0 评论 -
替罪羊树 → 洛谷P3369
替罪羊树(Scapegoat Tree),作为最简单的一种维护二叉树平衡的BST,采用简单而暴力的“摧毁、重建”方法维护二叉树的平衡:1.若二叉树的某棵子树不平衡了,先求得这棵子树的中序遍历序列,然后再删除这棵子树。谓之“摧毁”。2.以第1步得到的中序遍历序列的中间元素为根,构建一棵平衡的子树。谓之“重建”。原创 2023-01-11 17:23:53 · 342 阅读 · 0 评论 -
完全二叉树的权值 ← 蓝桥杯
完全二叉树的权值 ← 蓝桥杯原创 2022-10-29 16:15:21 · 95 阅读 · 0 评论 -
二叉树的遍历 ← C++实现
本算法改编自严蔚敏《数据结构(C语言版 第2版)》。本算法的输入是将原始二叉树按下图所示补充“#”号后的二叉树的先序序列ABD#G###CE##F##。特别提醒,本算法中的先序遍历、中序遍历、后序遍历函数的递归写法,特别清晰简洁。原创 2022-10-12 21:03:42 · 334 阅读 · 0 评论 -
P1087 [NOIP2004 普及组第三题] FBI 树
FBI树是一种二叉树,它的结点类型包括F结点,B结点和I结点三种。原创 2022-07-17 15:55:17 · 597 阅读 · 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 · 1743 阅读 · 1 评论 -
AcWing 3598:二叉树遍历 ← 依据二叉树的先序遍历和中序遍历求其后序遍历
分治法 → 详见示意图进行遍历代码编写原创 2021-07-26 15:16:11 · 2001 阅读 · 3 评论 -
依据二叉树的中序遍历和层次遍历求其先序遍历
【问题描述】树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。【输入格式】两行,每行是由大写字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的中序遍历和按层遍历的序列。【输出格式】一行,表示二叉树的先序序列。【数据范围】输入字符串的长度均不超过26。【输入样例】DBEACABCDE【输出样例】ABDEC【算法代码】#i原创 2021-07-26 17:01:35 · 1766 阅读 · 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 · 1141 阅读 · 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 · 301 阅读 · 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 · 117 阅读 · 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 · 137 阅读 · 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 · 139 阅读 · 0 评论 -
树的重心 ← STL及链式前向星两种实现
val[idx] 表示第 idx 条边的权值。e[idx] 表示第 idx 条边的终点。ne[idx] 表示与第 idx 条边同起点的最近一次被添加的边的编号。h[a] 表示以结点 a 为起点的最近一次被添加的边的编号。这个表述是在使用ne[idx]=h[a] 时,也即使用h[a]=idx++ 更新 h[a] 之前而言的。要特别注意这个语境。原创 2021-08-25 15:20:29 · 172 阅读 · 0 评论 -
树的高度 ← 链式前向星
val[idx] 表示第 idx 条边的权值。e[idx] 表示第 idx 条边的终点。ne[idx] 表示与第 idx 条边同起点的最近一次被添加的边的编号。h[a] 表示以结点 a 为起点的最近一次被添加的边的编号。这个表述是在使用ne[idx]=h[a] 时,也即使用h[a]=idx++ 更新 h[a] 之前而言的。要特别注意这个语境。原创 2021-08-27 11:34:24 · 155 阅读 · 0 评论 -
哈夫曼树(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 · 403 阅读 · 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 · 12714 阅读 · 3 评论