目录
树的概念
树的相关概念
树的表示
二叉树的概念
二叉树的性质
特殊的二叉树
满二叉树
完全二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树,是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的。
注意:在树形结构种,子树之间不能有交集,否则便不是树形结构;
一棵树有N个结点,那么它便有N-1条边。
结点的度:一个结点含有的子树的个数称为该结点的度;如上图:A的度为6.
叶结点/终端结点:度为0的结点称为叶结点;如上图:B、C、H、I…等结点为叶结点。
分支结点/非终端结点:除根结点外,度不为0的结点;如上图:D、E…等结点为分支结点。
父节点/双亲结点:若一个结点含有子结点,则这个结点称为其子结点的父节点;如上图: A是B的父结点。
子结点/孩子结点:一个结点含有的子树的根节点称为该结点的子结点;如上图: B是A的子结点。
兄弟结点:具有相同父结点的结点互称为兄弟结点;如上图 :B、C是兄弟结点。
树的度:一颗树中,最大的结点的度称为树的度。如上图:树的度为6。
结点的层次:从根开始定义起,根为第1层,根的子节点为第二层,以此类推。
树的高度或深度:树中结点的最大层次,如上图:树的高度为4.
堂兄弟结点:双亲结点在同一层的结点互为堂兄弟;如上图:H、I互为兄弟结点。
结点的祖先:从根到该结点所经分支上的所有结点;如上图:A是所有结点的祖先。
子孙:以某结点为根的子树中任一结点都称为该结点的子孙;如上图:所有结点都是A的子孙。
森林:由m(m>0)棵互不相交的树组成的集合称为森林。
树结构相对于线性表比较复杂,要存储表示起来就比较麻烦了,既要保存数据,也要保存结点和结点之间的关系,实际中树有很多种表示方法:如双亲表示法、孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。其中最常用的是孩子兄弟表示法,也就是左孩子右兄弟,如下:
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
即每个结点存储它的第一个左节点,和右边的兄弟结点位置即可,如图所示:
一棵二叉树是结点的一个有限集合,该集合:
1.可以为空。---空树
2.由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
注意:
1.二叉树不存在一个度大于2的结点,结点度的大小范围为【0~2】,至多只能为2度;
2.二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。
对于任意的二叉树都是由以下几种情况复合而成的:
综上,我们可以得出当已知父亲结点为i时,左孩子结点等于i*2+1,右孩子结点等于i*2+2;
当已知孩子结点(不分左右孩子)为k时,父亲节点=(孩子结点-1)/2.
一个二叉树,如果每一个层的结点数都达到最大值(除叶结点外,每个结点的度都为2),也就是说每个节点都要么没有子节点,要么有两个子节点,并且所有叶子节点都在同一层上,则这个二叉树就是满二叉树。
因此满二叉树具有以下性质:
1.如果一个二叉树的层数为k,则结点总数是2^k-1。
2.如果一棵满二叉树的叶子节点数为m,则该树的总节点数为2m-1。
如上图所示,满二叉树的特点是除黄框所圈的叶结点外,其余结点的度皆为二。
完全二叉树是效率很高的数据结构,是由满二叉树而引出来的。
完全二叉树满足以下两个条件:
1. 对于深度为 k 的节点,如果其存在,那么该节点的左子树深度为 k+1,右子树深度为 k 或者 k+1。
2. 对于所有深度不足 k+1 的节点,如果该节点有右子树但是没有左子树,则该节点必须是一个叶子节点。
也就是说,在一棵完全二叉树中,除了最后一层的节点可能不满之外,其它层的节点都必须是满的,而且最后一层的节点都集中在树的左侧,这就是完全二叉树的特点。
完全二叉树的叶子节点,从左向右必须连续的,而上图中叶子结点中间间断了因此不是一个完全二叉树。
如下图所示便是完全二叉树: