如果要实现树的结构,按照前面的链表实现指针域需要开一个数组,可能比较麻烦,这里采用静态实现,又考虑到一个结点的孩子树不确定,用vector定义变长数组,最后结构如下:
struct node{
datatype data;
vector<int>child;
}Node[maxn];
如果遇到某些问题只需要树的结点不需要数据域,上述结构还可以直接用vector<int>Node[maxn]
代替
树有两种遍历,是先根遍历和层序遍历,根据上述结构其实现如下:
void preorder(int root) { //先根遍历
printf("%d",Node[root].data);
for(int i=0;i<Node[root].child.size();i++)
preorder(Node[root].child[i]);
}
void layerorder(int root) { //层序遍历
queue<int>q;
q.push(root);
int temp;
while(!q.empty()){
temp=q.front();q.pop();
printf("%d",Node[temp].data);
for(int i=0;i<Node[root].child.size();i++){
q.push(Node[root].child[i]);
}
}
}
实际上,观察上述程序你会发现它和dfs、bfs十分相像,而遇到bfs,dfs问题可以将其途中的状态转化为树的结点,那问题也就直观的转化成对树的遍历问题。
对于求层次,求每层结点数、求路径这些问题应该熟练掌握。