树和二叉树
前瞻:
定义
-
树的定义
树 ( T r e e ) (Tree) (Tree)是 n ( n ≥ 0 ) n(n≥0) n(n≥0)个结点的有限集。
若 n = 0 n=0 n=0,称为空树
若 n > 0 n>0 n>0,则它满足如下两个条件:- (1)有且仅有一个特定的称为根 ( R o o t ) (Root) (Root)的结点;
- (2)其余结点可分为m(m≥0)个互不相交的有限集 T 1 , T 2 , T 3 , ⋅ ⋅ ⋅ T m T_1,T_2,T_3,···T_m T1,T2,T3,⋅⋅⋅Tm,其中每一个集合本身又是一棵树,并称为根的子树 ( S u b T r e e ) (SubTree) (SubTree)
-
树的基本术语
结点–数据元素以及指向子树的分支- 根节点–非空树中无前驱结点的节点
- 结点的度–结点拥有的子树数
- 分支结点(内部结点)、叶子结点(终端结点)–度:0
树的度–树内各结点的度的最大值
双亲结点、孩子结点、双亲结点
结点的祖先–从根到该结点所经分支上的所有结点
树的深度–树中结点的最大层次
有序树:树中结点的各子树从左到右有次序
无序树:树中的结点的各子树无次序
森林:是 m ( m ≥ 0 ) m(m≥0) m(m≥0)棵互不相交的树的集合 - 把根结点删除树就变成了森林
- 一棵树可以是一个特殊的森林
- 给森林中的各个树加上一个双亲结点,森林就变成了树
- 树一定是森林,森林不一定是树
-
树结构和线性结构的比较
线性结构 | 树结构 | |
---|---|---|
第一个元素 | 无前驱 | 根结点(只有一个)无双亲 |
最后一个元素 | 无后继 | 叶子结点(可以有多个)无孩子 |
其他元素 | 一个前驱,一个后继(一对一) | 一个双亲,多个孩子(一对多) |
- 二叉树的定义
二叉树引入:
二叉树是 n ( n ≥ 0 ) n(n≥0) n(n≥0)个结点的有限集,它或者是空集 ( n = 0 ) (n=0) (n=0)或者由一个根结点及两棵不相交的分别称作这个根的左子树和右子树的二叉树组成。
- 特点:
1.每个结点最多有俩孩子(二叉树中不存在度大于2的结点)
2.子树有左右之分、次序不能颠倒
3.二叉树可以是空集合,根可以有空的左子树或右子树
注:二叉树必须分左右
二叉树的性质
-
性质1:在二叉树的第 i i i层上至多有 2 i − 1 2^{i-1} 2i−1个结点,至少有1个结点
-
性质2:深度为K的二叉树至多有 2 K − 1 2^K-1 2K−1个结点 ( K ≥ 1 ) (K≥1) (K≥1),至少有 K K K个结点
-
性质3:对任何一棵二叉树 T T T,如果其叶子数位 n 0 n_0 n0,度为2的结点数为 n 2 n_2 n2,则 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1
-
满二叉树
一棵深度为K且有 2 K − 1 2^K-1 2K−1个结点的二叉树称为满二叉树
特点:- 1.每层上的结点数都是最大结点数(每层都满)
- 2.叶子结点全部在最底层
满二叉树在同样深度的二叉树中结点个数最多
满二叉树在同样深度的二叉树中叶子结点个数最多 -
完全二叉树
深度为 k k k的具有 n n n个结点的二叉树,当且仅当其每一个结点都与深度为 k k k的满二叉树中编号为 1 n 1~n 1 n的结点一一对应时,称之为完全二叉树。
特点:- 1.叶子只可能分布在层次最大的两层上
- 2.对任一结点,如果其右子树的最大层次为i,则其左子树的最大层次必为i或i+1
例子:
-
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
-
性质4:具有 n n n个结点的完全二叉树的深度为 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2n \rfloor +1 ⌊log2n⌋+1。
表明了完全二叉树结点数n与完全二叉树深度k之间的关系 -
性质5:如果对一棵有n个结点的完全二叉树(深度为 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2n \rfloor +1 ⌊log2n⌋+1)的结点按层序编号(从第1层到第 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2n \rfloor +1 ⌊log2n⌋+1层,每层从左到右),则对任一结点 i i i ( 1 ≤ i ≤ n ) (1\le i \le n) (1≤i≤n),有:
- (1)如果 i = 1 i=1 i=1,则结点 i i i是二叉树的根,无双亲;如果i>1,则其双亲是结点 ⌊ i / 2 ⌋ \lfloor i/2 \rfloor ⌊i/2⌋。
- (2)如果 2 i > n 2i>n 2i>n,则结点 i i i为叶子结点,无左孩子;否则其左孩子是结点 2 i 2i 2i。
- (3)如果 2 i + 1 > n 2i+1>n 2i+1>n,则结点 i i i无右孩子;否则,其右孩子是结点 2 i + 1 2i+1 2i+1。
表明了完全二叉树中双亲结点编号与孩子编号之间的关系
示意图:
二叉树的存储
二叉树的顺序存储
实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素
示意图:
- 二叉树顺序存储表示
#define MAXSIZE 100
typedef TElemType SqBiTree[MAXSIZE];
SqBiTree bt;
-
二叉树顺序存储的缺点
数组的长度定长
空间的浪费 -
特点:
结点间关系蕴含在其存储位置中;浪费空间,适于存满二叉树和完全二叉树
二叉树的链式存储
示意图:
- 二叉树链式存储表表示
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild;//左右孩子指针
}BiNode,*BiTree;
-
练习
在n个结点的二叉链表中,有n+1个空指针域 -
三叉链表