目录
一.树的定义:
树是n(n>=0)个结点的有限集合,互不相交集合。当n=0时,是一颗空树。
二.树的基本术语:
1.根结点:
非空树有且仅有一个根结点,如上图a:A为根结点。
2.结点的度:
每个结点所拥有的子树个数称为结点的度。其中所有结点中最大度称为树的度。如图上图a,从上到下从左到右每个结点的度分别为: A-2 B-3 C-2 D-0 E-1 F-0 G-0 H-0。可以看出树的度为3。
3.叶子结点,分支结点:
度为0的结点为叶子结点。度不为0的结点为分支结点。如上图a:叶子结点:D I F G H。 分支结点:A B C E。
4.孩子结点,双亲结点,兄弟结点:
每个结点的直接子结点为孩子结点。每个结点的根结点为双亲结点。有同一个双亲的孩子称为兄弟结点。如上图a:B结点的孩子结点为:D E F,B结点的双亲结点为A结点,B的兄弟结点为C。
5. 祖先,子孙:
结点的直接双亲或间接双亲为祖先,如上图a,I结点的祖先有E B A。以某个结点为根结点的所有子树中的结点为结点的子孙。如上图a,B的子孙结点有 D E F I。
6.结点的层数,树的深度(高度),树的宽度:
规定根结点的层数为1,结点在第k层,则孩子在k+1层。最后一层为树的深度(树的高度)。树中每一层中结点个数最大数为树的宽度。
三.树的遍历:
树的遍历:
有前序遍历(根左右),后序遍历(左右根)和层序遍历(从上到下,从左到右依次遍历)。相对二叉树少了中序遍历。因为结点的子树个数是不确定的,而二叉树每个结点的度<=2。
四.树的存储结构:
1.双亲表示法:
除根结点外,每个结点都仅有一个直接双亲结点。每个结点都存储数据和他的直接双亲结点的下标。根结点没有双亲,所以双亲下标为-1。
结构定义代码如下:
#define MaxSize 100
typedef char dataType;
typedef struct{
dataType data;
int parent;
}PNode;
typedef struct{
PNode tree[MaxSize];
int treeNum;
}Ptree;
2.孩子表示法
孩子表示法,顾名思义就是每个结点存储孩子结点。这和双亲表示法一样,也是存储下标。但是由于每个结点的孩子不止一个,所以我们还要一个结构来存孩子。那么就可以是顺序存储和链接存储。一下讲解都是以链接存储为例。
结构定义代码如下:
#define MaxSize 100
typedef char dataType;
typedef struct ChildNode{
int child;
ChildNode* next;
}ChildNode;
typedef struct{
dataType data;
ChildNode * first;
}TreeNode;
typedef struct{
TreeNode* tree[MaxSize];
int treeNum;
}CTree;
3.孩子兄弟表示法
孩子兄弟表示法又称二叉链表表示法。每个结点存储数据域及第一个孩子和右兄弟。
结构定义代码如下:
typedef char dataType;
typedef struct CSNode{
dataType data;
CSNode * firstchild;
CSNode * rightsib;
}CSNode;
CSNode * root;//根结点