普通树的一些操作,杂记

来源:互联网 发布:新疆网络推广 编辑:程序博客网 时间:2024/06/03 16:19

普通树的一些操作,杂记

//树的数据结构,静态实现 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);      //将当前结点的所有子结点入队列         }    }}
原创粉丝点击