树的存储结构
定义:1)只有一个根结点;2)其余结点为几个不相交的有限集,他们本身也是一棵树,且被称为根的子树。
树的定义就用到了递归的方法。
几个概念
结点的度:该结点拥有的子树的数量
叶结点:度为0的结点
树的度:结点度的最大值
层次:根结点为第一层,其孩子为第二层,以此类推。
深度:结点的最大层数
高度:数量和深度一致,不过是自底向上计数,叶结点的高度为1
树的存储结构
1)双亲表示法
下标 | data | parent |
---|---|---|
0 | A | -1 |
1 | B | 0 |
2 | C | 0 |
3 | D | 1 |
4 | E | 2 |
5 | F | 2 |
6 | G | 3 |
7 | H | 3 |
8 | I | 3 |
9 | J | 4 |
上表表示的树如下所示。
代码如下:
/*树的双亲表示法结点结构定义*/
#define MAX_TREE_SIZE 100
typedef int TElemType;
typedef struct PTNode
{
TElemType data;
int parent;
}PTNode;
typedef struct
{
PTNode nodes[MAX_TREE_SIZE];
int r, n;
} PTree;
还有孩子表示法,以及孩子双亲表示法与之类似;下面从树结点的兄弟角度思考,可以发现,任意一棵树,他的长子(如果存在)就是唯一的,它的右兄弟也是唯一的,所以可以用两个指针:一个长子域和其右兄弟域。这就是:
孩子兄弟表示法
代码如下:
typedef struct CSNode
{
TElemType data;
struct CSNode *firstchild,*rightsib;
} CSNode,*CSTree;
这种表示方法最大的好处,就是把一棵树变成了二叉树,这就和后边的基于二叉树的研究内容联系了起来。