简介
树,是一种非线性的存储结构,存储的是“一对多”关系的数据元素的集合
如图A就是存储了{ABCDEFGHIJKLM}的树的示意图,对于数据A来说,BCD是和A有关系的,对于数据B来说,E和F是和B有关系的,这就是“一对多”关系
基本术语
结点:树中的一个独立单元,包含一个数据元素及若干指向其子树的分支,也就是数据元素个体,如ABC等
结点的度:结点拥有的子树数称为结点的度,例如A的度为3,B的度为2,C的度为1,K的度为0
树的度:树中各结点度的最大值,例如图中树的度为3
叶子:度为0的结点称为叶子或者终端结点,结点KLFGMIJ都是树的叶子
双亲和孩子:结点的子树的根称为该结点的孩子,相应的,该结点称为孩子的双亲,例如B的双亲为A,且B有孩子EF;E的双亲为B,孩子为KL
兄弟:同一个双亲的孩子之间互称兄弟,例如HIJ互为兄弟
树的深度:树中结点的最大层次称为树的深度或高度,图中树的深度为4
二叉树
定义:
- 有且只有一个称之为根的结点
- 除了根结点之外的其余结点分为两个互不相交的子集,称为其的左子树和右子树
二叉树与树的区别:
- 二叉树每个结点至多只有两棵子树(即没有大于2的结点)
- 二叉树的子树有左右之分,其次序不能任意颠倒
根据定义可以有以下五种基本形态
二叉树的性质
性质一 :在二叉树的第i层上至多有2i-1个结点(i>=1)
性质二:深度为k的二叉树至多有2k-1个结点(k>=1)
性质三:对于任何一颗二叉树,其叶子结点数为n0,度为2的结点数为n2,则n0 = n2 + 1
性质四:具有n个结点的完全二叉树的深度为log2n + 1(向下取整,n>0)
满二叉树
特点:每一层上的结点数都是最大结点数,即每一层i的结点数都是最大值2i
完全二叉树
特点:
- 叶子结点只能在层次最大的两层上出现
- 对任一结点,若其右分支的的子孙的最大层次为l,则其左分支的子孙的最大层次必是l或l+1
满二叉树和完全二叉树的比较
二叉树的存储结构
-
顺序存储结构
- 顺序存储结构使用一组地址连续的存储单元来存储数据元素(例如数组),为了在存储结构中反映出结点之间的逻辑关系,必须按照一定规律安排在存储单元中
- 对于完全二叉树来说可以直接依次自上而下,自左至右存储结点,如图所示
- 而对于一般二叉树来说,每个结点需要与完全二叉树对应,用0表示不存在的结点
但是用这种方法可能会造成极大的浪费,于是我们就使用另一种方法
-
链式存储结构
- 由二叉树的定义可知,二叉树的结点由数据单元和指向左右孩子结点的分支构成,所以一般来说结点结构由左图所示的数据域和左、右指针域组成,但有时为了便于找到双亲结点,会添加一个指向双亲结点的指针域
- 由二叉树的定义可知,二叉树的结点由数据单元和指向左右孩子结点的分支构成,所以一般来说结点结构由左图所示的数据域和左、右指针域组成,但有时为了便于找到双亲结点,会添加一个指向双亲结点的指针域
/*
----结点的存储表示----
*/
typedef struct BiTree{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
下一章树的操作,暂时先鸽了