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

树的概念
树的每个点被称为节点;
连接的两个点,一个为父节点,一个为子节点,例如上图中,\(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}-$当天这种蔬菜卖出量), ... 
随机推荐
- Android ContenObserver 监听联系人数据变化
			一.知识介绍 1.ContentProvider是内容提供者 ContentResolver是内容解决者(对内容提供的数据进行操作) ContentObserver是内容观察者(观察内容提供者提供的数 ... 
- H-ui框架信息图标点击跳出页面问题
			在html中为消息a标签添加id: 在static/h-ui/js/H-ui.min.js添加事件: 
- JMeter中文返回乱码
			JMeter中文返回乱码 结果树响应数据中文返回乱码 其实有几个方法: 在线程组->http请求的字符集里设置  在http 消息管理头中设置  3.如果以上方法还没有解决,请打开安装目录 ... 
- table 的宽度设置无效
			1.在table 标签添加样式 table-layout: fixed; 必须设置width的值:<table style="table-layout: fixed"> ... 
- crontab 详细用法 定时任务
			转自:http://blog.chinaunix.net/uid-25785357-id-3434344.html 使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命 ... 
- spark-2.4.0-hadoop2.7-简单操作
			1. 说明 本文基于:spark-2.4.0-hadoop2.7-高可用(HA)安装部署 2. 启动Spark Shell 在任意一台有spark的机器上执行 # --master spark://m ... 
- Thirft简单使用
			安装Thrift 到thrift官网下载thrift.exe http://thrift.apache.org/download 将thrift-0.10.0.exe复制到C:\Program Fil ... 
- Redis学习笔记(2)——Redis的下载安装部署
			一.下载Redis Redis的官网下载页上有各种各样的版本,如图 但是官网下载的Redis项目不正式支持Windows.如果需要再windows系统上部署,要去GitHub上下载.我下载的是Redi ... 
- centos7下git版本升级及gitlab安装
			centos系统自带的git版本过低,当使用git拉取.推送.克隆的时候可能会报错,常见的错误: error: The requested URL returned error: 401 Unauth ... 
- git、github、gitlab之间的关系
			GIt-版本控制工具:GitHub-一个网站平台,提供给用户空间存储git仓储,保存用户的一些数据文档或者代码等:GitLab - 基于Git的项目管理软件. Git分布式版本控制系统 Git是一款自 ... 
