树和二叉树的定义
树的定义
树的基本术语
-
结点:数据元素以及指向子树的分支
-
根节点: 飞空树种无前驱结点的结点
-
结点的度:结点拥有子树的个数(结点后继分支的个数)
-
树的度:树内各结点的度的最大值。
-
度 = 0 叶子 终端结点
-
度 != 0 分支结点,非终端结点跟结点以外的分支结点称为内部结点
-
结点的祖先:从根到该结点所经分支上的所有结点。
-
节点的子孙:以某结点为根的子树中的任一结点。
-
树的深度:树中结点的最大层次。
-
有序树:树中结点的各子树从左到右有次序(最左边的为第一个孩子)。
-
无序树:树中结点的各子树无次序。
-
森林:是m (m >= 0) 棵互不相交的树的集合
-
把根结点删除树就变成了森林。
-
一棵树可以看成是一个特殊的森林。
-
给森林中各子树加上双亲结点,森林就变成了树。
-
树一定是森林 但是 森林不一定是树
-
二叉树的定义
为何要重点研究每结点最多只有两个叉的树?
-
二叉树的结构最简单,规律性最强
-
可以证明,所有树都能转化为唯一对应的二叉树,不失一般性。
二叉树的特点
-
每个结点最多有两个孩子(二叉树中不存在度大于2的结点)
-
子树有左右之分,其次序不能颠倒。
-
二叉树可以是空集合,根可以有空的左子树或空的右子树
二叉树不是树的特殊情况,他们是两个概念
案例引入
树和二叉树的抽象数据类型定义
二叉树的性质和存储结构
性质1:在二叉树
得第i 层上至多
有2^(i-1)个结点(i>=1)
-
第i层上至少有 1 个结点
性质2:深度为k的二叉树至多有 2^k - 1个结点(k> = 1)
-
深度为 k 时至少有 k 个结点
-
性质3:对任何一颗二叉树T,如果其叶子数为 n0,度为2的结点数为n2,则 n0 = n2 + 1
性质4:具有n个结点的完全二叉树的深度为 [log2n]+1。
性质5:
两种特殊形式的二叉树
-
满二叉树
-
完全二叉树
他们在顺序存储方式下可以复原!
满二叉树
一棵深度为 k 且有 2^k - 1个结点的二叉树称为满二叉树。
特点:
-
每一层上结点数都是最大结点数(即每层都满)
-
叶子结点全部在最底层
对满二叉树结点位置进行编号
-
编号规则:从根结点开始,自上而下,自左而右
-
每一结点位置都有元素
-
完全二叉树:
特点:
-
叶子只可能分布在层次最大的两层上
-
对任一结点,如果其右子树的最大层次为i,则其左子树的最大层次必为 i 或 i+1
二叉树的顺序存储
// 二叉树的顺序存储结构
# define MAXSIZE 100
typedef int TElemType SqBiTree[MAXSIZE];
SqBiTree bt;
二叉树的链式存储
二叉链表
typedef int TElemType;
typedef struct BiNode{
TElemType data;
struct BiNode *Lchild,*Rchild; // 左右孩子指针
}BiNode,*BiTree;
三叉链表