如果要实现树的结构,按照前面的链表实现指针域需要开一个数组,可能比较麻烦,这里采用静态实现,又考虑到一个结点的孩子树不确定,用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问题可以将其途中的状态转化为树的结点,那问题也就直观的转化成对树的遍历问题。
对于求层次,求每层结点数、求路径这些问题应该熟练掌握。