此处的树,子结点的个数没有限制且子结点没有先后次序的树
树与二叉树的不同之处就在于树的子结点数可能会有很多,如果利用动态写法,利用链表的指针来指示的话会比较麻烦,利用静态写法,也就是用数组下标来代替所谓的地址,当然这需要事先开一个大小不低于结点上限个数的结点数组,因此结构体node的定义如下:
struct node{
typename data;//数据域
int child[maxn];//指针域,存放所有子结点的下标
}Node[maxn];//结点数组,maxn为结点上限个数
在上面的定义中,由于无法预知子结点的个数,因此child数组的长度只能开到最大,而这对一些结点个数比较多的题目来说显然是不可能的,开辟的空间过多会超过限制。因此需要使用vector,结构体的定义如下:
struct node{
typename data;//数据域
vector child;//指针域,存放所有子结点的下标
}Node[maxn];//结点数组,maxn为结点上限个数
与二叉树的静态实现相似,当需要新建一个结点时,就按顺序从数组中取出一个下标即可
int index=0;
int newNode(int v){
Node[index].data=v;//数据域为v
Node[index].child.clear();//清空子结点
return index++;//返回结点下标,并令index自增
}
若是题目中给出结点的编号为从0-n-1连续或从1-n连续,则不需要newNode函数,题目中的编号就可以直接作为Node数组的下标。
如果题目中不涉及数据域的情况,只需要树的结构,则上述的结构体可以直接转换为vector数组,即vector<int>child[maxn],,每个vector都存放了各结点的所有子结点