1.树的定义
- 树的定义:树(Tree)是n(n≥0)个结点的有限集,它或为空树(n = 0);或为非空树,对于非空树T:
- (1)有且仅有一个称之为根的结点;
- (2)除根结点以外的其余结点可分为m(m>0)个互不相交的有限集T1, T2, …, Tm, 其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
2.树的基本术语
- 根:即根结点(没有前驱)
- 叶子:即终端结点(没有后继)
- 森林:指m棵不相交的树的集合(例如删除A后的子树个数)
- 有序树:结点各子树从左至右有序,不能互换(左为第一)
- 无序树:结点各子树可互换位置。
- 双亲:即上层的那个结点(直接前驱)
- 孩子:即下层结点的子树的根(直接后继)
- 兄弟:同一双亲下的同层结点(孩子之间互称兄弟)
- 堂兄弟:即双亲位于同一层的结点(但并非同一双亲)
- 祖先:即从根到该结点所经分支的所有结点
- 子孙:即该结点下层子树中的任一结点
- 结点:即树的数据元素
- 结点的度:结点挂接的子树数
- 结点的层次:从根到该结点的层数(根结点算第一层)
- 终端结点:即度为0的结点,即叶子
- 分支结点:即度不为0的结点(也称为内部结点)
- 树的度:所有结点度中的最大值
- 树的深度 (或高度):指所有结点中最大的层数
3.二叉树的定义
- 二叉树(Binary Tree)是n(n≥0)个结点所构成的集合,它或为空树(n = 0);或为非空树,对于非空树T:
- (1)有且仅有一个称之为根的结点;
- (2)除根结点以外的其余结点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身又都是二叉树。
- 二叉树与树一样具有递归性质,二叉树与树的区别主要有以下两点:
- (1)二又树每个结点至多只有两棵子树(即二又树中不存在度大于2的结点)
- (2)二叉树的子树有左右之分,其次序不能任意颠倒。
- 为何要重点研究每结点最多只有两个 “叉” 的树?
- 二叉树的结构最简单,规律性最强;
- 可以证明,所有树都能转为唯一对应的二叉树,不失一般性。
4.二叉树的性质
- 性质1: 在二叉树的第i层上至多有个结点。
- 性质2: 深度为k的二叉树至多有个结点。
- 性质3:对于任何一棵二叉树,若2度的结点数有n2个,则叶子数n0必定为n2+1 (即n0=n2+1)
- 特殊形态的二叉树:
- 满二叉树:一棵深度为k且有个结点的二叉树。(特点:每层都“充满”了结点)
- 完全二叉树:深度为k 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k 的满二叉树中编号从1至n的结点一一对应
- 完全二叉树的叶结点仅出现在最下面两层:1.最下层的叶结点一定出现在左边;2.倒数第二层的叶结点一定出现在右边
- 完全二叉树中度为1的结点只有左孩子
- 同样结点数的二叉树,完全二叉树的高度最小
- 性质4:具有n个结点的完全二叉树的深度必为[log2n]+1。([x]表示不大于x的最大整数)
- 性质5:棵有n个结点的二叉树(高度为[1og2n]+1,按层次对结点进行编号(从上到下,从左到右),对任意结点i有:
- 如果i=1,则结点i是二叉树的根;
- 如果i>1,则其双亲结点为[i/2];
- 如果2i<=n,则结点i的左孩子为2i
- 如果2i>n,则结点i无左孩子
- 如果2i+1<=n,则结点i的右孩于为2i+1
- 如果2i+1>n,则结点i无右孩子
5.二叉树的存储结构
5.1 顺序存储结构
- 实现:按满二叉树的结点层次编号,依次存放二叉树中的数据元素。
- 特点:
- 结点间关系蕴含在其存储位置中;
- 浪费空间,适于存满二叉树和完全二叉树。
5.2 链式存储结构
- 设计不同的结点结构可构成不同形式的链式存储结构。由二叉树的定义得知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成,则表示二叉树的链表中的结点至少包含3个域:数据域和左、右指针域。有时,为了便于找到结点的双亲,还可在结点结构中增加一个指向其双亲结点的指针域。利用这两种结点结构所得二叉树的存储结构分别称之为二叉链表和三叉链表,如图所示。链表的头指针指向二叉树的根结点。
- 二叉链表
typedef struct BiNode
{
TElemType data;
struct BiNode *lchild,*rchild; // 左右孩子指针
}BiNode,*BiTree;
- 在n个结点的二叉链表中,有n+1个空指针域。
- 分析:必有2n个链域。除根结点外,每个结点有且仅有一个双亲,所以只会有n-1个结点的链域存放指针,指向非空子女结点。
- 空指针数目=2n-(n-1)=n+1
- 三叉链表
typedef struct TriTNode
{
TelemType data;
struct TriTNode *lchild,*parent,*rchild;
}TriTNode,*TriTree;