复习:
1.栈内元素个数怎么计算?
2.共享栈栈满条件?
3.顺序存储的栈top指的是?链式存储的栈top指的是?链式栈的结构是?
4.循环队列(顺序存储)中front指的是?rear指的是?链队中二者分别指的是?链队的结构是
5.循环队列中,当前队列中元素个数,以及队列满的条件?
6.为什么循环队列和链队中rear指的位置不一样?
树是N(N>=0)个结点的优先级和,N=0时,称为空树,这是一种特殊情况。
举个栗子:
猴哥的花果山里面有很多猴子,都是猴哥的子孙(这里我们就不探究父系繁衍这种深层次的话题了,姑且认为每个猴子可以通过把一根毛,吹一下可以吹出好多个猴子)。所有的猴子都可以拿系谱图表述出来:
猴哥有三个孩子(A1,A2,A3)。A1有三个孩子(B1,B2,B3);A2没有生育功能,故没有孩子;A3有一个孩子(C1);
B1有一个孩子D1;B2和他二伯A2一样没有生育功能,故没有孩子;B3继承他爸A1优良的生育能力,有两个孩子E1,E2。
可以看到:
1.所有的猴子只有一个祖先猴哥
(有且仅有一个特定的称为根的结点)
2.猴哥是石头缝里蹦出来的,所以他没有父亲(头上没有棍棍),其他猴子都有,并且只有一个父亲(头上有棍棍)
(树的根结点没有前驱结点,出根结点以外的所有结点有且只有一个前驱结点)
3.一个猴子可以生很多个小猴子,也有可能一个都生不出来
(树中所有结点可以有零个或多个后继结点)
4.我们可以看到上面,每一个猴子头上都有一条边,也就是一个父亲(除了根节点)。
(n个结点的树中有n-1条边)
一些概念
1.到根结点路上的任意一个结点是祖先结点,D1的祖先结点有(猴哥,A1,B1),子孙结点刚好相反,所以D1是(猴哥,A1,B1)的子孙结点。
2.拥有共同双亲的结点是兄弟结点,A1,A2,A3是兄弟结点。
3.子结点个数为度,A1的度为3,A2的度为0。
4.结点层次,结点深度(往下走,最大走多少次),结点高度(往上走,走多少次)
5.树的高度为树中最大的层数。
6.森林相当于一堆没有血缘关系的家庭或者是物种组成的集合。
7.上述这几点都不考,理解就行。
1.树中结点数等于所有结点的度数加1
度数其实也就是边数(我们在有向图里面将会提到出度和入度,也就是图中指向该结点的边数和由该结点指出的边数)。这里的度指的是出度,也就是结点下面连的棍棍数,我们可以看到,除了头结点,每个人头上都有一个棍棍,假设有n个结点,一共应该是有n-1条棍棍,也就是度之和为n-1,所以树中结点数等于所有结点的度数加1。
2.度为m的树中第i层上至多有个结点(i>=1)
也就是说第i代至多有几个娃,度为m表示一个人最多能生m个娃。很容易理解的是要求最多的话,之前的每一代的每一个人都要生m个娃,也就是第一代(1 = )个人,第二代 (m =
)个人,第三代(m*m =
)......可以看到第i代最多
3.高度为h的m叉树至多有个结点
这里面也提到的是最多,高度为h,也就是这个种群一共繁衍了h代,每个人最多繁衍m个个体,问种群中最多有多少人。在第二问中,我们推了每一代最多的个体数,这一问其实就是一个求和,而且是等比数列求和。具体公式用高中的知识就能推出来。
4.具有n个结点的m叉树的最小高度为
完全二叉树的高度最小。具有n个结点的最后一个结点的编号是n,假设最小高度是h,也就是最后一个结点在h层上,我们知道h层的第一个结点的编号是,最后一个结点的编号是
,所以有:
根据右面可得:
根据左面可得:
二叉树是另一种树形结构,其特点是每个节点至多只有两棵子树,并且二叉树的子树有左右之分,其次序不能任意颠倒
举个栗子
之前猴子们都无节制的生小猴子,为了促进花果山全面协调可持续发展,猴哥决定实行计划生育,其是做好猴口与计划生育工作最根本的保障和最有力的推动。对于加快猴口与计划生育法制建设,全面提高猴口与计划生育工作的管理服务水平,促进猴口与经济社会协调发展和可持续发展必将产生重大而深远的影响。
因此,其决定每个猴最多生俩猴子(大哥,二哥)。
3.1几个特殊的二叉树
1.满二叉树:一颗高度为h,并且含有个结点的二叉树称为满二叉树。
满的意思就是放的满满的,在高度为h下,再也插不进来一个猴子(前提是不破坏二叉树的规矩)。至于,枚举h=1,2,3就可以推出来了
2.完全二叉树:设一个高度为h,有n个结点的二叉树,当且仅当其每一个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。
完全的意思就是完整,传统观念是每家生两个才叫好(这里容许最后一家生一个),所以完全二叉树就是所有家庭都生俩,最后一个家庭可以只生一个。
3.二叉排序树:左结点<父亲<右结点
4.平衡二叉树:树上任一结点的左子树深度和右子树深度之差不超过1。
3.2 二叉树的几个性质(很重要)
1.非空二叉树上叶子结点数等于度为2的结点数加1,即
我们可以把所有的猴分为三类,生了俩猴子的,生了一个猴子的,不孕不育的。其总人数分别为:,所以:
总人数 =
而度在这里主要指的是出度,也就是一个猴子生了几个猴子,度为了表示一个猴子生俩猴,(也就是下面接了俩棍棍)。所以:
棍棍数=
之前我们在将树的时候提到,根节点头上是没有棍棍的,而其他人头上都有棍棍,所以:
总人数 = 棍棍数+1
把上面两个公式带入得:
找个小学生一化简得:,这个公式很重要。
2.非空二叉树上第K层至多有个结点
枚举k = 1,2,3,4就可以推出来了。我喜欢能枚举的东西尽量不记。
3.高度为H的二叉树至多有个结点
我们知道满二叉树的结点最多,多到再也插不进来一个结点了。所以根据满二叉树结点数为,便可以推出来。
4.对于完全二叉树按照从上到下、从左大有的顺序依次编号1,2,3,4,5...N,则有以下关系:
a.当i>1时,结点i的双亲结点编号为
就是对a去下界,比如a = 1.9或者1.1时候,
= 1。这个枚举一下,也可以看出来。
b.当2i<=N时候,结点i的左孩子编号为2i,否则无左孩子,当2i+1<=N时候,结点i的右孩子编号为2i+1,否则无右孩子
这里主要差异是完全二叉树容许最后一个孩子是左孩子(也就是最后一个家庭只生一个孩子)。
c.结点i所在层次(深度)
我们知道结点i的编号也就是i,第h层第一个结点的编号是 (枚举一下),最后一个结点编号是
,所以有:
我们只看左面,易得
我们只看右面,易得
这俩公式我建议现场推~反正我是记不住
在之前的内容中,我们讲到线性表、栈、队列都有顺序表示也有链式表示。二叉树也不列外。
1.定义看书上,要明白顺序存储的优势以及链式存储的优势。
2.在顺序存储中,注意数组下标是从1开始的,为什么?
3.链式存储中,含有n个结点的二叉链表中含有n+1个空链域
这个结论很重要,在链式存储中,不管其有没有左右孩子,我们都给他开辟了空间 *lchild,*rchild。
1.首先我们不考虑根节点的话,所以每个人都下接两个棍棍(不管棍棍下面有没有连孩子),而每个人都消耗一个棍棍。相当于每一个人生产一个空链域。n-1个人生产n-1一个空链域
2.对于根节点来说,其生产俩棍且不消耗棍,所以其生产两个空链域 1个人生产2个空链域。
上面;两个加起来得n个结点的二叉链表中含有n+1个空链域
1.一颗高度为h的满m叉树:
a.求编号为i的双亲结点的编号是多少?
b.编号为i的结点的第k个孩子结点的编号是多少
c.编号为i的结点有右兄弟的条件是什么,其右兄弟的结点编号是多少
有右兄弟的条件是它不能是他爸生的最后一个孩子(最右边的结点,右是相对于他爸生的那帮孩子来说,不是整个一层)。那么只要i<他爸最后一个孩子的编号,就有右孩子,编号是i+1
最优孩子的编号怎么求?其实求他爸第一个孩子编号以后加m就是最右孩子的编号,而第一个孩子的编号怎么算?按照a问,算出i属于他那层第K个区,然后第一个孩子的编号就是(K-1)*m +1, 然后再加上m就是最后一个孩子的编号。(这里面可能会算出来h,h可以通过i替换)