目录
1. 树的概念及结构
1.1 树的名词定义
1.2 树的表示
2. 二叉树的概念及结构
2.1 二叉树的概念
2.2 特殊的二叉树
2.2.1 满二叉树
2.2.2 完全二叉树
2.3 二叉树的存储结构
2.3.1 顺序存储
2.3.2 链式存储
3. 选择题
1. 树的概念及结构
1.1 树的名词定义
1. 节点的度:一个节点含有的子树的个数称为该节点的度,如上图:A的度为6。
2. 叶子节点或终端节点:度为0的节点称为叶子节点,如上图:B、C、H、I...等节点为叶子节点。
3. 非终端节点或分支节点:度不为0的节点,如上图:D、E、F、G...等节点为分支节点。
4. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点,如上图:A是B的父节点。
5. 孩子节点或子节点:一个节点有父节点,则这个节点是父节点的子节点,如上图:B是A的孩子节点。
6. 兄弟节点:具有相同父节点的节点互称为兄弟节点,如上图:B、C是兄弟节点。
7. 树的度:一棵树中,最大的节点的度称为树的度,如上图:树的度为6。
8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
9. 树的高度或深度:树中节点的最大层次,如上图:树的高度为4。
10. 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为堂兄弟节点。
11. 节点的祖先与子孙:在一条路径中,以某个节点为视角,在你上面的节点是你的祖先,在你下面的节点是你的子孙。如上图:A-E-J-Q,以E为视角,A是E的祖先,J和Q是E的子孙。
12. 森林:由多棵互不相交的树的集合称为森林;
13. 任何一颗非空二叉树,度为0的节点永远比度为2的节点多一个。
1.2 树的表示
树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法,孩子兄弟表示法等。下面介绍孩子兄弟表示法。
typedef int DataType; struct Node { struct Node* _firstChild1; // 第一个孩子结点 struct Node* _pNextBrother; // 指向其下一个兄弟结点 DataType _data; // 结点中的数据域 };
2. 二叉树的概念及结构
2.1 二叉树的概念
1. 二叉树不存在度大于2的结点。
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。
注意:对于任意的二叉树都是由以下几种情况复合而成的:
2.2 特殊的二叉树
2.2.1 满二叉树
1. 有一颗二叉树,每一个层的结点数都达到最大值,也就是每一层都是满的,则这颗二叉树就是满二叉树。
2. 假设一颗满二叉树的层数为h,那么它的节点总数就是2^h - 1。
由图可知,F(h) = 2^(1-1) + 2^(2-1) + 2^(3-1) + 2^(4-1) + ... + 2^(h-1)。
利用错位相减法得出:F(h) = 2^h - 1。
2.2.2 完全二叉树
1. 有一颗二叉树,从第一层到倒数第二层都是满的,最后一层可满可不满,但节点必须是连续的,则这颗树是完全二叉树。
2. 满二叉树是一种特殊的完全二叉树。
3. 假设有一颗完全二叉树,层数为h,那么这颗二叉树的最大节点个数和最小节点个数分别是多少?
答:当完全二叉树每层都满时节点个数最大,这时可以看作是层数为h的满二叉树,所以最大个数为2^h - 1。
当最后一层的节点只有一个时,总节点个数最小,可以把第一层到倒数第二层看作是满二叉树,再加上最后一层的一个节点即可。得出2^(h-1)。
2.3 二叉树的存储结构
二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
2.3.1 顺序存储
1. 顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。
2. 二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
3. 父子节点的下标关系:
leftchild = parent*2 + 1
rightchild = parent*2 + 2
parent = (child-1) / 2
完全二叉树的顺序存储
非完全二叉树的顺序存储
结论:完全二叉树才适合用数组存储。
2.3.2 链式存储
1. 二叉树的链式存储结构是指,用链表来表示一棵二叉树。
2. 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。
3. 链式结构又分为二叉链和三叉链。
typedef int BTDataType; // 二叉链 struct BTNode { struct BTNode* Left; // 指向当前节点左孩子 struct BTNode* Right; // 指向当前节点右孩子 BTDataType data; // 当前节点值域 }; // 三叉链 struct BTNode { struct BTNode* Parent; // 指向当前节点的双亲 struct BTNode* Left; // 指向当前节点左孩子 struct BTNode* Right; // 指向当前节点右孩子 BTDataType data; // 当前节点值域 };
3. 选择题
1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199
答:B
2.下列数据结构中,不适合采用顺序存储结构的是( )
A 非完全二叉树
B 堆
C 队列
D 栈
答:A
3.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A n
B n+1
C n-1
D n/2
答:A
解析:在完全二叉树中,度为1的节点最多为1,最少为0。
4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12
答:B
5.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386
答:B
DataStructure: 数据结构 (gitee.com)