数据结构中树的存储结构(c++代码实现)
在数据结构这门课中树是一种一对多的数据类型,常见树的存储结构的表示方法有如下几种:
- 双亲表示法
- 孩子表示法
- 孩子兄弟表示法
1.双亲表示法:
这是一种以连续内存(数组)来存储树的结点的方法,每一个结点中,都带有一个指示器指向双亲结点在这段连续内存中的位置,这样就可以用数组来实现树数据结构了。结构如下:
class TreeNode
{
private:
int date; //数据域
int* parent; //指针域
public:
TreeNode(int date1, int*parent1=nulptr) :date(date1), parent(parent1) {} //构造函数
TreeNode(){} //析构函数
};
该表示法的缺点也是存在的,因为只为结点设置了双亲结点指针,所有在内存中寻找孩子结点时还是只能遍历树结构才行。
2.孩子表示法
如果我们让每一个结点同时拥有多个指针域,其中每一个指针指向一棵子树的根结点,我们把这种方法叫做多重链表示法:
class TreeNode
{
private:
int date; //数据域
int** parent; //指针域,里面保存的是指向每一个子结点的指针信息
public:
TreeNode(int date1, int**parent1) :date(date1), parent(parent1) {} //构造函数
TreeNode(){} //析构函数
};
该方法预先不能知道每一个结点的子结点是多少,造成很多指针域都是空的,容易造成内存空间的浪费,读者可以自主的将代码进行改进,如可以在结点中加一个记录子结点数目的数据域。
3.孩子兄弟表示法
上面我们分别从双亲以及孩子的角度研究存储结构,接下来介绍用兄弟怎么来表示树这种数据结构。首先我们知道任意一棵树,中间的任意一个结点都只拥有一个大孩子(第一个孩子),而对于每一个孩子都最多只有一个右兄弟,因此我们可以设置两个指针域分别直指向自己的大孩子和右兄弟。
class TreeNode
{
private:
int date; //数据域
int* firstchild;
int* rightbro;
public:
TreeNode(int date1, int* firstchild1,int* rightbro1) :date(date1), firstchild(firstchild1),rightbro(rightbro1) {} //构造函数
TreeNode(){} //析构函数
};
小结:
以上是一般树的常见表示方法,读者可以发挥自己的想象力对这些表示方法进行改进,总而言之,存储结构的设计是一个非常灵活的设计。读者可以自己发挥想象力设计自己的存储结构的表示方法。