树&堆
树
什么是树?
大概像下面这样:

树的概念
树的每个点被称为节点;
连接的两个点,一个为父节点,一个为子节点,例如上图中,\(1\)是\(4\)的父节点,\(4\)是\(1\)的子节点;
没有父节点的节点称为根节点,注意:每一个非根节点的节点有且只有一个父节点;
没有子节点的节点称为叶子节点,如上图中,\(6,10,5,9,7,8\)是叶子节点;
一棵树必然由\(n\)个节点,\(n-1\)条边组成;
除了根节点外,每个子节点可以分为多个不相交的子树;
同“辈分”的节点在树的同一层里,例如上图,\(2,3,4\)是同一层的;
树的深度就是树的层数,例如上图,树的深度为\(3\);
树里面没有环!
树的存储
使用结构体数组
struct node
{
int data,father;
//data代表这个节点的编号
//father代表这个节点的父节点的编号
}tree[...];
二叉树
一种特殊的树,一个节点最多只能有\(2\)个子节点,大概长下面这样:

树的概念在二叉树中同样有用,另外,还有几个二叉树独有的性质:
在二叉树的第\(i\)层上最多有\(2^{i-1}\)个节点\((i \ge 1)\);
深度为\(k\)的二叉树至多有\(2^{k-1}\)个节点\((k \ge 1)\);
满二叉树
一棵深度为\(n\),节点数为\(2^{n-1}\)的二叉树,就像下图:

完全二叉树
一棵从上向下,从左向右标号和满二叉树对应的二叉树,如下图:

二叉树的存储
依然使用结构体数组。
struct node
{
int lchild,rchild,father;
//lchild代表这个节点的左子节点
//rchild代表这个节点的右子节点
//father代表这个节点的父节点的编号
}tree[...];
二叉树的遍历

前序遍历
二叉树的前序遍历顺序为:
1.访问父节点
2.前序遍历左子树
3.前序遍历右子树
\(Code:\)
void qianxu(int a)
{
if(a)
{
cout<<a<<" ";
qianxu(tree[a].lchild);
qianxu(tree[a].rchild);
}
return ;
}
如上图,遍历结果为:1 3 9 5 4 6 10 2 7 8
中序遍历
二叉树的前序遍历顺序为:
1.前序遍历左子树
2.访问父节点
3.前序遍历右子树
\(Code:\)
void zhongxu(int a)
{
if(a)
{
zhongxu(tree[a].lchild);
cout<<a<<" ";
zhongxu(tree[a].rchild);
}
}
如上图,遍历结果为:9 3 6 4 10 5 1 7 2 8
后序遍历
二叉树的前序遍历顺序为:
1.前序遍历左子树
2.前序遍历右子树
3.访问父节点
\(Code:\)
void houxu(int a)
{
if(a)
{
houxu(tree[a].lchild);
houxu(tree[a].rchild);
cout<<a<<" ";
}
}
如上图,遍历结果为:9 6 10 4 5 3 7 8 2 1
堆
一种特殊的完全二叉树,分小根堆和大根堆两种堆。
大根堆:父节点一定比子节点大;
长的如下:

小根堆:父节点一定比子节点小。
长的如下:

树&堆的更多相关文章
- BZOJ3224/LOJ104 普通平衡树 treap(树堆)
您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...
- 【bzoj3689】异或之 可持久化Trie树+堆
题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...
- 可旋转Treap(树堆)总结
树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树.其基本操作的期望时间复杂度为O(logn).相对于其他的平衡二叉搜索树,Trea ...
- hihocoder 1193 树堆 解题报告
题目大意:给出一棵有根树(根为 \(0\) ),点有点权.可以删除点(非根),并将其子树接到其父亲上.我们称一个树为树堆当前仅当树上每个点都满足其权值大于等于其子树中所有点的点权.现在对于每个点要求其 ...
- 查找——图文翔解Treap(树堆)
之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. T ...
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...
- <知识整理>树--堆及其应用
预备知识: 完全二叉树的定义:一个深度为k数的二叉树(设根节点的深度为1),若二叉树深度从1到k-1层都是满的,而第k层的节点都集中在左边(即第k层不存在两节点之间有空缺),那么此数就被叫做完全二叉树 ...
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流
题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...
随机推荐
- iPad----------教你如何查询ipad型号
1.首先进入苹果官网 找到support https://support.apple.com 2.找到查询ipad型号的地方 点击Check coverage for your produc ...
- 两种常用的全排列算法(java)
问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符 ...
- 如何为 .NET Core CLI 启用 TAB 自动补全功能
如何为 .NET Core CLI 启用 TAB 自动补全功能 Intro 在 Linux 下经常可以发现有些目录/文件名,以及有些工具可以命令输入几个字母之后按 TAB 自动补全,最近发现其实 do ...
- 从0开始的Python学习010return语句&DocStrings
return语句 return语句用来从一个函数中 返回 即跳出函数.当然也可以从函数中返回一个值. #return 语句从一个函数返回 即跳出函数.我们也可选从函数返回一个值 def maximum ...
- 时序数据库InfluxDB安装及使用
时序数据库InfluxDB安装及使用 1 安装配置 安装 wget https://dl.influxdata.com/influxdb/releases/influxdb-1.3.1.x86_64. ...
- CentOS7编译安装php7.1
1.首先安装依赖包: yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl ...
- .NET MVC全局异常处理(一)
目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...
- Hadoop Compatibility in Flink
18 Nov 2014 by Fabian Hüske (@fhueske) Apache Hadoop is an industry standard for scalable analytical ...
- golang 解析XML
用adb操控android手机时,可以解析页面控件信息(xml) 代码如下: package main import ( "encoding/xml" "fmt" ...
- MYSQL primary key use btree 是什么含义了解一下
CREATE TABLE `sth_definition` ( `id` int(11) NOT NULL AUTO_INCREMENT, `analyseId` bigint(20) DEFAULT ...