普通树的一些操作,杂记



 //树的数据结构,静态实现  struct Node{ typename data; //数据域 vector child; //指针域,存放所有子结点的下标  }node[maxn]; //结点数组,maxn为结点上限个数 //新建一个树结点,但是,一般考试中设计树(非二叉树)的考查时, //一般都给出了结点的编号,我们可以把给定的编号直接作为node数组的 //下标来使用。  int index=0; int new_node(int v) { node[index].data =v; node[index].child.clear(); //清空子结点 return index++; //返回结点下标,并令index自增  } //如果题目中不涉及结点的数据域只需要数的结构 //简化为: vector<int> child[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]); //递归访问结点root的所有子结点  } } //树的层序遍历 void layerorder(int root) { queue<int> queue; queue.push(root); while(!queue.empty()) { int front=queue.front(); printf("%d ",node[front].data); //访问当前结点的数据 queue.pop(); for(int i=0;i<node[front].child.size();i++) { queue.push(node[front].child[i]); //将当前结点的所有子结点如队列  } } } //带 层 的树的数据结构静态实现 struct Node{ int layer; //记录层号  int data; vector<int> child; }node[maxn]; //新的树的 层序遍历 void layerorder(int root) { queue<int> queue; queue.push(root); node[root].layer=1; while(!queue.empty()) { int front=queue.front(); //取出队首元素  printf("%d ",node[front].data); queue.pop(); for(int i=0;i<node[front].child.size();i++) { int child=node[front].child[i]; node[child].layer=node[front].layer+1; queue.push(child); //将当前结点的所有子结点入队列  } } }