什么是树?

大概像下面这样:

树的概念

树的每个点被称为节点;

连接的两个点,一个为父节点,一个为子节点,例如上图中,\(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

一种特殊的完全二叉树,分小根堆和大根堆两种堆。

大根堆:父节点一定比子节点大;

长的如下:

小根堆:父节点一定比子节点小。

长的如下:

树&堆的更多相关文章

  1. BZOJ3224/LOJ104 普通平衡树 treap(树堆)

    您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...

  2. 【bzoj3689】异或之 可持久化Trie树+堆

    题目描述 给定n个非负整数A[1], A[2], ……, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n ...

  3. 可旋转Treap(树堆)总结

    树堆,在数据结构中也称Treap,是指有一个随机附加域满足堆的性质的二叉搜索树,其结构相当于以随机数据插入的二叉搜索树.其基本操作的期望时间复杂度为O(logn).相对于其他的平衡二叉搜索树,Trea ...

  4. hihocoder 1193 树堆 解题报告

    题目大意:给出一棵有根树(根为 \(0\) ),点有点权.可以删除点(非根),并将其子树接到其父亲上.我们称一个树为树堆当前仅当树上每个点都满足其权值大于等于其子树中所有点的点权.现在对于每个点要求其 ...

  5. 查找——图文翔解Treap(树堆)

    之前我们讲到二叉搜索树,从二叉搜索树到2-3树到红黑树到B-树. 二叉搜索树的主要问题就是其结构与数据相关,树的深度可能会非常大,Treap树就是一种解决二叉搜索树可能深度过大的还有一种数据结构. T ...

  6. BZOJ 2006 NOI2010 超级钢琴 划分树+堆

    题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...

  7. <知识整理>树--堆及其应用

    预备知识: 完全二叉树的定义:一个深度为k数的二叉树(设根节点的深度为1),若二叉树深度从1到k-1层都是满的,而第k层的节点都集中在左边(即第k层不存在两节点之间有空缺),那么此数就被叫做完全二叉树 ...

  8. [十二省联考2019]异或粽子——可持久化trie树+堆

    题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...

  9. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流

    题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...

随机推荐

  1. $符号报not defing 报错

    https://blog.csdn.net/weixin_37969488/article/details/84250833 最近因为工作问题,需要我把别的项目上的一些jsp网页copy到新项目上.放 ...

  2. java基础中this,super

    this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类. this的用法就不累赘的说 ...

  3. 浅谈TCP IP协议栈(一)入门知识【转】

    说来惭愧,打算写关于网络方面的知识很久了,结果到今天才正式动笔,好了,废话不多说,写一些自己能看懂的入门知识,对自己来说是一种知识的总结,也希望能帮到一些想了解网络知识的童鞋. 万事开头难,然后中间难 ...

  4. Linux分页机制之概述--Linux内存管理(六)

    1 分页机制 在虚拟内存中,页表是个映射表的概念, 即从进程能理解的线性地址(linear address)映射到存储器上的物理地址(phisical address). 很显然,这个页表是需要常驻内 ...

  5. AFNetworking源码浅析

    本文将从最简单的GET请求方法的使用入手,由表及里,逐步探究AFNetworking如何封装处理原生的网络请求. 一.AFNetworking的简单使用 -(void)getDemo{ AFHTTPS ...

  6. 用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。

    数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列. 方法一: select (case when a>b then a el ...

  7. LeetCode算法题-Longest Univalue Path(Java实现)

    这是悦乐书的第290次更新,第308篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第158题(顺位题号是687).给定二叉树,找到路径中每个节点具有相同值的最长路径的长度 ...

  8. jenkins安装详细教程

    一.jenkins简介 jenkins是一个开源的软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 1.持续的软件版本 ...

  9. vi命令下常用命令

    dd:删除游标所在的一整行(常用)ndd:n为数字.删除光标所在的向下n行,例如20dd则是删除光标所在的向下20行d1G:删除光标所在到第一行的所有数据dG:删除光标所在到最后一行的所有数据d$:删 ...

  10. vue 使用localStorage解决vuex在页面刷新后数据被清除的问题

    通常,我们在使用vue编写页面时,会需要使用vuex在组件间传递(或者说共同响应)同一个数据的变化.例如:用户的登录信息. 下面,我们使用传递用户登录信息的例子来一步步解决这个问题. 首先,我们的第一 ...