前面我们已经介绍了栈与队列,这两个是线性的数据结构,当然也不止这两个,还包括顺序表和单链表。
今天我们要介绍的是非线性的结构——树。但树的结构比较复杂,我们选择二叉树重点讲。
0.引言
上面已经说到了,树是一种非线性的结构,它由有限个结点组成,具有一定的层序关系。但是我们学习的树的物理形态和我们现实中的树略有不同,它是一颗倒置的树。 如图。
最上面的结点称为根节点,根节点有且只有一个,根节点往下分出不同的枝干,枝干又继续往下分,具有一定的递归关系,我们可以猜到树应该是递归定义的,这确实是对的。
要注意:树之间的枝干不能有交集,也就是树当中不能有环,否则就不是树。
1.1树的相关概念
如图,A链接B,而B链接D和C,通过B就能找到C和D,找到D又能找到E->H->I,E->F。
通过这种方式,就将树链接起来了,并且树的表示具有统一性。
1.3树的实际应用
磁盘目录中的文件储存就是一个很好的例子。
每一个文件视为一个结点的话,每个文件夹往下又有不同的文件夹,展开就是一个经典的树状结构。
2.1二叉树的概念
上面提到树概念时说到了树的度,一颗树可以有不同的度,也就是说根节点链接的子树的个数可以不同。
但是二叉树的不同,二叉树要求每个结点的度最多是2。
如果树中每个结点都有左右孩子,那么这个树就称为满二叉树。如果树的前K-1层已经满了,但是第K层没有满,且第K层的节点从左往右顺序排序,那么这种树称为完全二叉树。
满二叉树可以视为一个特殊的完全二叉树。
1.若规定二叉树根节点所在层为第一层,那么它的第i层最多有2^(i-1)个节点,这是比较显然的一个结论,第一个有1个,第二层最多有2个,第三层最多有4个,不断递归得到结论。
2.若规定二叉树根节点所在层为第一层,一个深度为h的满二叉树的节点个数为2^h -1。
满二叉树的所有节点个数= 1+2+4+8+.......+2^(h-1) ,由等比数列的求和公式,立即得到结论。
3.条件同上,如果一个满二叉树的节点个数为n,那么有2^h -1 = n ->深度h = log(n+1)。
4.对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为n2 ,则有
5.假设父亲结点的位置是i,那么左孩子的位置是2*i+1,右孩子是2*i+2。如果已知左孩子的位置是i,那么父亲结点的位置是(i-1)/2,而如果已知右孩子的位置是i,那么父亲结点的位置是(i-2)/ 2。实际上都是一样的,我们可以统一用(i-1)/2来代替。
接下来我们用上面提到的结论来解决下面的五个问题。
1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )A 不存在这样的二叉树B 200C 198D 1992. 下列数据结构中,不适合采用顺序存储结构的是( )A 非完全二叉树B 堆C 队列D 栈3. 在具有 2n 个结点的完全二叉树中,叶子结点个数为( )A nB n+1C n-1D n/24. 一棵完全二叉树的节点数为 531 个,那么这棵树的高度为( )A 11B 10C 8D 125. 一个具有 767 个节点的完全二叉树,其叶子节点个数为()A 383B 384C 385D 386
答案1.B 2.A 3.A 4. B 5. B
本次的介绍到此结束,下期会介绍二叉树的顺序结构与堆,以及堆的具体实现。