目录
树
树的定义
树是n(n>=0)个节点的有限集,当n=0时,它为空树,当n>0时为非空树。
树与二叉树都是重要的非线性数据结构。
对于非空树T的特点:
1>有且只有一个称之为根的节点。
2>除根节点以外的其余节点可分为m(m>0)个互不相交的有限集T1,T2,T3……,Tm,其中每一个集合本身又是一棵树,并且称为根的子树.
树的基本术语
1.根:即根节点(没有前驱)。
2.节点:树中的一个独立单元。包含一个数据元素及若干指向其子树的分支。
3.节点的度:节点拥有子树的度称为子树。
4.树的度:树的度是树内各节点度的最大值。
5.叶子:度为0的节点称为叶子或终端节点。(没有后继)
6.非终端节点:度不为0的节点称为非终端节点或分支节点。除根节点外,非终端节点也称为内部节点。
7.双亲和孩子:节点的子树的根称为该节点的孩子,相应的,该节点称为孩子的双亲。
8.兄弟:同一个双亲的孩子之间互称为兄弟。
9.祖先:从根到该节点所经分支上的所有节点。
10.子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
11.层次:节点的层次从根开始定义,根为第一层,根的孩子为第二层。树中任一节点的层次等于其双亲节点的层次+1。
12.堂兄弟:双亲在同一层的节点互为堂兄弟。
13.树的深度:树中的节点的最大层次称为树的深度或高度。
14.有序树和无序树:如果将树中节点的各子树看成从左至右是有次序的(不能互换),则称为该树为有序树,否则称为无序树。
15.森林:m棵互不相交的树的集合。
二叉树
二叉树的定义
二叉树是n (n>=0) 个节点所构成的集合。n=0时它或为空树,n>0时它为非空树。
非空树T的特点:
1.有且仅有一个称之为根节点。
2.除根节点以外的其余节点分为两个互不相交的子集T1和T2,分别称为T的左子树和右子树,且T1和T2本身也是二叉树。
二叉树不是树的特殊情况,二叉树与树都具有递归的性质,但二叉树和树之间的区别有:
1.二叉树的每个节点至多只有两棵子树(二叉树中不存在度大于2的节点)。
2.二叉树的子树有左右之分,其次序不能任意颠倒。而树并没有方向之分。
二叉树的性质和存储结构
二叉树的性质
1.在二叉树的第i层至多有2^(i-1)个节点,第i层至少有1个节点。
2.深度为k的二叉树至多有2^k-1(k>=1)个节点,深度为k的二叉树至少有k个节点。节点个数=边的个数+1。
3.对任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1。若度为1的节点数为n1,则其节点总数为n=n0+n1+n2。
4.具有n个节点的完全二叉树的深度为[log2n]+1。(假如深度为k,完全二叉树满足的定义有:2^(k-1)-1<n<=2^k-1或2^(k-1)<=n<2^k,于是k-1<=log2n<k,所以k=[log2n]+1)。
二叉树的两种特殊形态
二叉树的两种特殊形态分别是满二叉树和完全二叉树,满二叉树是完全二叉树的一个特例。
满二叉树
满二叉树是深度为k且含有2^k-1个节点的二叉树。
其特点是:
1.每一层上的节点数都是最大节点数,即每一层i的节点数都具有最大值2^(i-1)。
2.叶子节点全部在最底层。
完全二叉树
完全二叉树是深度为k的、有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号从1至n的节点一 一对应时,称之为完全二叉树。
在满二叉树中,从最后一个节点开始,连续去掉任意个节点,即是一个完全二叉树。
其特点是:
1.叶子节点只可能在层次最大的两层上出现。
2.对任一节点,若其右分支下的子孙的最大层次为l,则其左分支下的子孙的最大层次必为l或l+1。
二叉树的存储结构
二叉树的存储结构也可以采用顺序存储结构和链式存储结构两种方式。
顺序存储结构
#define MAXSIZE 100 //二叉树的最大节点数
typedef TElemType SqBiTree[MAXSIZE]; //0号单元存储根节点
SqBiTree bt;
顺序存储结构使用一组地址连续的存储单元来存储数据元素。对于完全二叉树,只要从根起按层序存储即可,依次自上而下,从左至右存储节点元素。对于一般的二叉树,应该将其每个节点与完全二叉树上的节点相对照,用0表示不存在的节点,这就有可能造成空间极大的浪费,所以对于完全二叉树适用于顺序存储结构,而一般二叉树更适用于链式存储结构。
链式存储结构
由二叉树的定义可知,二叉树节点由一个数据元素和分别指向其左、右子树两个分支构成,则表示二叉树链表中的节点至少包含3个域:数据域和左、右指针域。
定义一个二叉链表:(二叉树的二叉链表存储表示)
typedef struct BiTNode
{
TElemType data; //节点数据域
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;