在今天的学习中,将会介绍二叉树的基本概念,以及一些零碎的知识点
树的基本介绍
二叉树是一种非线性的结构,是由有限个节点组成的有层次的集合,因为形状像一颗倒挂的树,所以我们叫他二叉树:
观察这颗树的结构,我们发现,除最上层节点以外,其他的节点的上面都连了一个节点,那我们说这个节点是有先驱节点,也叫父节点的,没有先驱节点的那个节点就叫根节点,对应图中的1号节点,继续观察,有一些节点的下面有节点,有一些没有节点,这个节点叫当前节点的后继节点,也叫孩子节点,没有后继节点的就叫叶子节点,对应图中的4,5,7号节点。注意,在图中我们可以看出,除根节点以外每一个节点都只有一个先驱节点,有0个或者多个后继节点,回想递归的定义,大事化小,小事化了,和二叉树是对应的,因此,二叉树是递归定义的。
子树的定义:
对于上图而言,1234567号节点构成了一个二叉树,从根节点开始,向左右延申,2号节点及其后继节点,就叫做1号节点的左子树,3号节点及其后继节点就叫做1号节点的右子树
注意,这里的子树是不能相交的,相交的就不叫二叉树了,左右都是分开的。
节点的度:
一个节点后继节点的数量叫做节点的度,上图每个二叉树的度如下:
注意,对于树来说也有度,树的度就是节点中度的最大值,在这里就是2
节点的层次:
从根节点开始,根节点处于第一层,接下来就是第二层,第三层…
描述树结构的方法
这里我们只说一种最常用也是最优的表示方法:左孩子右兄弟表示法。
即为一个节点储存三个信息,一个是自身的数值,一个是左孩子的地址,一个是该节点右边兄弟节点的地址,在这里补充说明一下兄弟节点的定义:
具有相同父节点的节点互为兄弟节点就像上图中 2,3互为兄弟节点,5,6互为兄弟节点。
代码表示如下
typedef int DataType;
typedef struct TreeNode
{
struct TreeNode* firstchild;
struct TreeNode* rightbrother;
DataType data;
}TreeNode;
为什么要这么表述呢,演示一下大家就能明白,在上面的树上稍加改动:
现在是一个树,而非二叉树,我们用左孩子右兄弟表示法表示一下:
也就是当这种方法构建出来以后,我们通过1节点就能找到任意一种节点,并且任何特殊情形都适用,把一个复杂的逻辑结构通过一个个结构体表示了出来。
二叉树
二叉树则是树的另一个分支,而且应用较广,那么什么是二叉树呢?就是孩子节点只能由0个,1个或者2个,符合这种条件的就是二叉树,像上图中3的孩子节点由5,5.5,6三个节点构成,这就不叫二叉树。
像这种树形结构,就是二叉树的一种。
满二叉树
满二叉树就是除叶子节点之外,每一个节点都有两个后继,这样的树就叫做满二叉树
这就是一个标准的满二叉树,满二叉树中有一些规律,例如第一层有 20个节点,第二层有 21个节点,第三层有 22个节点,如果用n表示二叉树的层数,那么每一层就有 2n-1个节点,其次整个树的节点个数为 2k-1个节点,k为最大的层数。
完全二叉树
满二叉树是完全二叉树的一种情况,那么完全二叉树又是什么?
完全二叉树的孩子节点可以有0,1,2个,并不非要是2个,但是注意,如果节点的度为1,那一定是有左孩子没有右孩子:
就像这样,3节点的度为1,但是他只有左孩子,没有右孩子,如果是只有右孩子没有左孩子,那就不叫一个完全二叉树。
二叉树的性质
1.如果规定根节点的层数为1,则一棵非空二叉树的第i层最多有2i-1个节点(也就是满二叉树的情况)
2.如果规定根节点的层数为1,则一棵非空二叉树的节点数量最多是2k-1个(也是满二叉树)
3.对于任何一颗二叉树,如果度为0的节点个数为n0个,度为2的节点个数为n2个,那么n0 = n2 + 1 这个解释一下,我们可以想象一下 最开始二叉树只有一个根节点,
现在度为0的节点有一个,现在我们加上一个左孩子
可以发现,度为0的节点减少了一个,但是又增加了一个,所以如果加一个节点对于度为零的总数没有影响,那如果加两个节点呢?
这时可以看到,度为零的节点有两个,度为2的节点为1个,再给他们加节点也是一样的规律,也就是度为0的节点永远比度为2的节点多一个(其实就是因为开始有个根节点,所以度为0开始就有一个,后来度为0和度为1一起增加,但是基础别人就比你多一个)。
4.如果规定根节点的层数为1,则一棵有n个节点的满二叉树的深度等于这个可以用公式算出来,满二叉树每一层个数构成等比数列 如果树的深度为h,那么一共有 2h-1个节点,现在节点总数为n,也就是n =
2h-1个,h也就能算出来了.
5.对于具有n个节点的完全二叉树,如果按照从上到下从左到右的顺序对所有节点从0开始编号,那么对于序号为i的节点有
1)i > 0 , i 的双节点为 (i-1)/2;
2)2i+1<n 左孩子为 2i+1
3)2i+2<n 右孩子为 2i+2
就是规律,可以画个图看一下:
小结
零碎的知识点很多,但是还是有必要了解,在了解这些基本概念以后,在下一篇博客中将会教大家如何把堆实现出来。