K叉树的运算

来源:互联网 发布:python drdos 编辑:程序博客网 时间:2024/05/16 16:56

问题:求K叉树叶子结点的数目和深度

以以下4叉树为例(K=4)结点旁的数字代表结点数据域中存放的值,ROOT表示根结点,根结点数据域为0


解答(C语言):

#include <stdio.h>#include <malloc.h>#define K 4   //树的最大分叉数struct TreeNode   //表示K叉树节点的结构体类型{int data;    //节点数据域struct TreeNode *Link[K];  //节点指针域,结构体指针数组};typedef struct TreeNode TreeNode1;struct Path    //遍历K叉树过程中链表栈的节点{TreeNode1 *current;  //指向链表节点代表的K叉树节点的指针int direction;   //指向由链表节点代表的K叉树节点的下一个节点的Link数组元素的下标加一后的值    struct Path *pnext, *pbefore;   //双向链表的左链指针和右链指针};typedef struct Path Path1;int ComputeLeaf(TreeNode1 *root, int *depth);   //计算K叉树叶子数目和深度的函数int Search(TreeNode1 *ptr, int d); //寻找ptr指向的K叉树节点上从d开始下一可走方向int Enable(TreeNode1 *ptr, int m);  //判定在ptr指向的K叉树节点上方向m是否可走void main(){int i, depth;   //depth为K叉树深度    TreeNode1 *temp1, *temp2;                       //创建4叉树TreeNode1 *root=(TreeNode1 *) malloc(sizeof(TreeNode1));root->data=0;root->Link[0]=NULL;for(i=1; i<=3; i++){root->Link[i]=(TreeNode1 *) malloc(sizeof(TreeNode1));root->Link[i]->data=i;}for (i=1; i<=4; i++)root->Link[1]->Link[i-1]=NULL;temp1=root->Link[2];for (i=1; i<=4; i++){temp1->Link[i-1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp1->Link[i-1]->data=i+3;}temp2=temp1->Link[0];temp2->Link[1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[1]->data=10;for (i=1; i<=4; i++)temp2->Link[1]->Link[i-1]=NULL;    temp2->Link[3]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[3]->data=11;for (i=1; i<=4; i++)temp2->Link[3]->Link[i-1]=NULL;temp2->Link[0]=temp2->Link[2]=NULL;temp2=temp1->Link[2];temp2->Link[2]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[2]->data=12;for (i=1; i<=4; i++)temp2->Link[2]->Link[i-1]=NULL;temp2->Link[0]=temp2->Link[1]=temp2->Link[3]=NULL;temp2=temp1->Link[1];for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp2=temp1->Link[3];for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1=root->Link[3];temp1->Link[1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2=temp1->Link[1];temp2->data=8;for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1->Link[3]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2=temp1->Link[3];temp2->data=9;for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1->Link[0]=temp1->Link[2]=NULL;printf ("K叉树的叶子结点数目为%d\n", ComputeLeaf(root, &depth));   //计算叶子数目和深度,输出叶子数目printf ("K叉树的深度为%d\n", depth-1);   //输出深度}int ComputeLeaf(TreeNode1 *root, int *depth){int i;for (i=1; i<=K; i++){if (root->Link[i-1]!=NULL)break;}if (i>K)    //K叉树为只有根节点的空树{*depth=0;  return 1;   //深度为0,叶子数为1}else{int d, k, flag;   //d为当前方向,k为K叉树层数    int count;   //计数变量,统计叶子数目    TreeNode1 *ptr, *interval;   //ptr指向遍历过程中的当前节点ptr=root;  //ptr初始化,指向根节点d=0;  //方向初始化为0count=0;  //计数变量初始化k=1;    //层数初始化flag=0;    Path1 *psnewbe, *psnewaf, *head, *current;          head=(Path1 *) malloc(sizeof(Path1));          psnewbe=head;                         //路径链表初始化        psnewaf=head;                     head->pnext=NULL;          head->pbefore=NULL;while(1){if (Search(ptr, d)==0){if (ptr==root)   //在根节点无下一可走方向,遍历结束,退出循环break;else{if (d==0)    //找到一个叶子{count++;   //计数变量加一if (flag==0){*depth=k;flag=1;             //通过比较确定叶子深度最大值,求出K叉树深度}else{if (*depth<k)*depth=k;}k--;ptr=psnewaf->current;    //回溯d=psnewaf->direction;continue;}else{k--;free(psnewaf);psnewbe->pnext=NULL;                          psnewaf=psnewbe;                                           psnewbe=psnewbe->pbefore;  //回溯ptr=psnewaf->current;d=psnewaf->direction;continue;}}}else{if (d==0){current=(Path1 *) malloc(sizeof(Path1));  //找到下一个节点,当前节点加入路径链表                    current->current=ptr;current->direction=Search(ptr, d);interval=ptr->Link[current->direction-1];current->pnext=NULL;                      psnewaf->pnext=current;                      current->pbefore=psnewaf;                                  psnewbe=psnewaf;                      psnewaf=current; }else{psnewaf->direction=Search(ptr, d);     //在当前节点找到新方向,更新当前节点方向interval=ptr->Link[psnewaf->direction-1];}ptr=interval;    //递进至下一节点d=0;k++;continue;}}    return count;   //返回叶子总数}}int Search(TreeNode1 *ptr, int d){int m=d;for(m++; m<=K; m++){if (Enable(ptr, m)==1)return m;}return 0;}int Enable(TreeNode1 *ptr, int m){if (ptr->Link[m-1]!=NULL)return 1;elsereturn 0;}
运行结果:


以上程序有多个变体,详见下文


问题:求K叉树m层节点总数

解答(C语言)

#include <stdio.h>#include <malloc.h>#define K 4struct TreeNode{int data;struct TreeNode *Link[K];};typedef struct TreeNode TreeNode1;struct Path{TreeNode1 *current;int direction;    struct Path *pnext, *pbefore;};typedef struct Path Path1;int ComputeLeaf(TreeNode1 *root, int m);  //函数,求第m层节点总数int Search(TreeNode1 *ptr, int d);int Enable(TreeNode1 *ptr, int m);void main(){int i, m;   //m指定要搜索结点数目的层数    TreeNode1 *temp1, *temp2;TreeNode1 *root=(TreeNode1 *) malloc(sizeof(TreeNode1));root->data=0;root->Link[0]=NULL;for(i=1; i<=3; i++){root->Link[i]=(TreeNode1 *) malloc(sizeof(TreeNode1));root->Link[i]->data=i;}for (i=1; i<=4; i++)root->Link[1]->Link[i-1]=NULL;temp1=root->Link[2];for (i=1; i<=4; i++){temp1->Link[i-1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp1->Link[i-1]->data=i+3;}temp2=temp1->Link[0];temp2->Link[1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[1]->data=10;for (i=1; i<=4; i++)temp2->Link[1]->Link[i-1]=NULL;    temp2->Link[3]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[3]->data=11;for (i=1; i<=4; i++)temp2->Link[3]->Link[i-1]=NULL;temp2->Link[0]=temp2->Link[2]=NULL;temp2=temp1->Link[2];temp2->Link[2]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[2]->data=12;for (i=1; i<=4; i++)temp2->Link[2]->Link[i-1]=NULL;temp2->Link[0]=temp2->Link[1]=temp2->Link[3]=NULL;temp2=temp1->Link[1];for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp2=temp1->Link[3];for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1=root->Link[3];temp1->Link[1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2=temp1->Link[1];temp2->data=8;for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1->Link[3]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2=temp1->Link[3];temp2->data=9;for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1->Link[0]=temp1->Link[2]=NULL;printf("请输入想求节点数目的K叉树层数\n");scanf("%d", &m);      //输入想求结点数目的层数if ((i=ComputeLeaf(root, m))==0)     //m层不存在printf("%d超出K叉树深度,第%d层不存在\n", m, m);printf ("K叉树第%d层的结点数目为%d\n", m, i);  //输出m层结点总数}int ComputeLeaf(TreeNode1 *root, int m){int i;for (i=1; i<=K; i++){if (root->Link[i-1]!=NULL)break;}if (i>K)    //空树{if (m==1)    return 1;   //第一层一个节点,即根节点elsereturn 0;  //其余各层不存在}else{if (m==1)return 1;  //同上else{    int d, k;        int count;  //计数变量,统计m层结点数        TreeNode1 *ptr, *interval;    ptr=root;     d=0;    count=0;    k=1;        Path1 *psnewbe, *psnewaf, *head, *current;              head=(Path1 *) malloc(sizeof(Path1));              psnewbe=head;              psnewaf=head;                         head->pnext=NULL;              head->pbefore=NULL;    while(1){    if (Search(ptr, d)==0){    if (ptr==root)   break;    else{    if (d==0){    k--;    ptr=psnewaf->current;    d=psnewaf->direction;    continue;}    else{    k--;    free(psnewaf);    psnewbe->pnext=NULL;                              psnewaf=psnewbe;                                               psnewbe=psnewbe->pbefore;    ptr=psnewaf->current;    d=psnewaf->direction;    continue;}}}    else{     if (d==0) {     current=(Path1 *) malloc(sizeof(Path1));                         current->current=ptr;     current->direction=Search(ptr, d);     interval=ptr->Link[current->direction-1];     current->pnext=NULL;                           psnewaf->pnext=current;                           current->pbefore=psnewaf;                                       psnewbe=psnewaf;                           psnewaf=current;  }     else {     psnewaf->direction=Search(ptr, d);     interval=ptr->Link[psnewaf->direction-1]; }     ptr=interval;     d=0;     k++; if (k==m)   //到达第m层 { count++;   //计数变量加一 ptr=psnewaf->current; d=psnewaf->direction;   //回溯 k--; }     continue;}}        return count;  //返回m层结点总数}}}int Search(TreeNode1 *ptr, int d){int m=d;for(m++; m<=K; m++){if (Enable(ptr, m)==1)return m;}return 0;}int Enable(TreeNode1 *ptr, int m){if (ptr->Link[m-1]!=NULL)return 1;elsereturn 0;}

问题:在K叉树中搜索给定值m

解答(C语言)

#include <stdio.h>#include <malloc.h>#define K 4struct TreeNode{int data;struct TreeNode *Link[K];};typedef struct TreeNode TreeNode1;struct Path{TreeNode1 *current;int direction;    struct Path *pnext, *pbefore;};typedef struct Path Path1;struct SearchNode    //用于存放搜索到的为给定值m项的结构体类型{int plies;     //所在层数TreeNode1 *goal;   //指向该项的指针TreeNode1 *before;   //指向该项父结点的指针struct SearchNode *next;};typedef struct SearchNode SearchNode1;SearchNode1 *ComputeLeaf(TreeNode1 *root, int m, int *count);   //函数,在K叉树中搜索给定值m,统计K叉树中值为m的结点个数,返回SearchNode1链表头结点void Order(int i, int m, int *number, SearchNode1 *before, TreeNode1 *root, int plies, SearchNode1 **Location);  //函数,输出以*Location为起点,before为终点的SearchNode1链表段中各结点项位置int Search(TreeNode1 *ptr, int d);int Enable(TreeNode1 *ptr, int m);void main(){int i, m, count=0, number=0;  //m为要搜索的值,count为m项总数    TreeNode1 *temp1, *temp2;SearchNode1 *head, *before, *after, *Location;TreeNode1 *root=(TreeNode1 *) malloc(sizeof(TreeNode1));root->data=0;root->Link[0]=NULL;for(i=1; i<=3; i++){root->Link[i]=(TreeNode1 *) malloc(sizeof(TreeNode1));root->Link[i]->data=i;}for (i=1; i<=4; i++)root->Link[1]->Link[i-1]=NULL;temp1=root->Link[2];for (i=1; i<=4; i++){temp1->Link[i-1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp1->Link[i-1]->data=i+3;}temp2=temp1->Link[0];temp2->Link[1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[1]->data=10;for (i=1; i<=4; i++)temp2->Link[1]->Link[i-1]=NULL;    temp2->Link[3]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[3]->data=5;for (i=1; i<=4; i++)temp2->Link[3]->Link[i-1]=NULL;temp2->Link[0]=temp2->Link[2]=NULL;temp2=temp1->Link[2];temp2->Link[2]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[2]->data=12;for (i=1; i<=4; i++)temp2->Link[2]->Link[i-1]=NULL;temp2->Link[0]=temp2->Link[1]=temp2->Link[3]=NULL;temp2=temp1->Link[1];for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp2=temp1->Link[3];for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1=root->Link[3];temp1->Link[1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2=temp1->Link[1];temp2->data=8;for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1->Link[3]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2=temp1->Link[3];temp2->data=9;for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1->Link[0]=temp1->Link[2]=NULL;    for (i=1; i<=K; i++){if (root->Link[i-1]!=NULL){break;}}printf("请输入要在K叉树中搜索的值\n");scanf("%d", &m);   //输入要搜索的值if ((head=ComputeLeaf(root, m, &count))->next==NULL)  //m项不存在{printf("%d在K叉树中不存在\n", m);printf("K叉树中共有%d个%d项\n", count, m);}else{before=head;after=head->next;Location=after;while(after!=NULL){if (before->plies<after->plies)    //按层数由小到大,每层从左至右的顺序输出所有m项位置{if (before!=head)                    {Order(i, m, &number, before, root, before->plies, &Location);}}after=after->next;before=before->next;}Order(i, m, &number, before, root, before->plies, &Location);printf("K叉树中共有%d个%d项\n", count, m);  //输出m项总数} }SearchNode1 *ComputeLeaf(TreeNode1 *root, int m, int *count){int i;SearchNode1 *head1, *psnew1, *after, *before;head1=(SearchNode1 *) malloc(sizeof(SearchNode1));head1->next=NULL;       //链表初始化head1->plies=0;for (i=1; i<=K; i++){if (root->Link[i-1]!=NULL)break;}if (i>K)   //空树{if (root->data==m){        psnew1=(SearchNode1 *) malloc(sizeof(SearchNode1));   //只有根节点需要加入SearchNode1链表中            psnew1->plies=1;            psnew1->goal=root;        psnew1->before=NULL;            psnew1->next=NULL;        head1->next=psnew1;(*count)++;}return head1;}else{if (root->data==m){        psnew1=(SearchNode1 *) malloc(sizeof(SearchNode1));            psnew1->plies=1;            psnew1->goal=root;        psnew1->before=NULL;            psnew1->next=NULL;        head1->next=psnew1;(*count)++;}int d, k;    TreeNode1 *ptr, *interval;ptr=root;    d=0;k=1;    Path1 *psnewbe, *psnewaf, *head, *current;          head=(Path1 *) malloc(sizeof(Path1));          psnewbe=head;          psnewaf=head;                     head->pnext=NULL;          head->pbefore=NULL;while(1){if (Search(ptr, d)==0){if (ptr==root)break;else{if (d==0){k--;ptr=psnewaf->current;d=psnewaf->direction;continue;}else{k--;free(psnewaf);psnewbe->pnext=NULL;                          psnewaf=psnewbe;                                           psnewbe=psnewbe->pbefore;ptr=psnewaf->current;d=psnewaf->direction;continue;}}}else{if (d==0){current=(Path1 *) malloc(sizeof(Path1));                    current->current=ptr;current->direction=Search(ptr, d);interval=ptr->Link[current->direction-1];current->pnext=NULL;                      psnewaf->pnext=current;                      current->pbefore=psnewaf;                                  psnewbe=psnewaf;                      psnewaf=current; }else{ psnewaf->direction=Search(ptr, d); interval=ptr->Link[psnewaf->direction-1];}ptr=interval;d=0;k++;        if (ptr->data==m)  //找到一个m项{    (*count)++;    psnew1=(SearchNode1 *) malloc(sizeof(SearchNode1));  //建立该m项对应的SearchNode1结点                    psnew1->plies=k;                    psnew1->goal=ptr;    psnew1->before=psnewaf->current;before=head1;    after=head1->next;    while (after!=NULL){    if (before->plies<after->plies)     //将SearchNode1结点插入至SearchNode1链表中,确保插入后链表中相同层数的结点所属的块按层数大小以从小到大顺序从左至右排列,且每个块中各节点排列顺序与他们在树的同一层中出现的顺序一致{    if (psnew1->plies<after->plies){   psnew1->next=before->next;   before->next=psnew1;   break;}}    after=after->next;    before=before->next;}    if(after==NULL){    psnew1->next=NULL;    before->next=psnew1;}}continue;}}return head1;}}void Order(int i, int m, int *number, SearchNode1 *before, TreeNode1 *root, int plies, SearchNode1 **Location){if (i>K)      //空树{(*number)++;printf("第%d个%d结点位于第%d层上从左自由数起第%d个位置\n", *number, m, 1, 1); //SearchNode1链表中只有一个结点需要输出return;}else{if (plies==1)  //要处理链表块只有一个结点,层数1,即为根节点        {(*number)++;    printf("第%d个%d结点位于第%d层上从左自由数起第%d个位置\n", *number, m, 1, 1);*Location=(*Location)->next;return;}else{    int d, k, count;        TreeNode1 *ptr, *interval;    ptr=root;count=0;     d=0;    k=1;        Path1 *psnewbe, *psnewaf, *head, *current;              head=(Path1 *) malloc(sizeof(Path1));              psnewbe=head;              psnewaf=head;                         head->pnext=NULL;              head->pbefore=NULL;    while(1){    if (Search(ptr, d)==0){    if (ptr==root)   break;    else{    if (d==0){    k--;    ptr=psnewaf->current;    d=psnewaf->direction;    continue;}    else{    k--;    free(psnewaf);    psnewbe->pnext=NULL;                              psnewaf=psnewbe;                                               psnewbe=psnewbe->pbefore;    ptr=psnewaf->current;    d=psnewaf->direction;    continue;}}}    else{     if (d==0) {     current=(Path1 *) malloc(sizeof(Path1));                         current->current=ptr;     current->direction=Search(ptr, d);     interval=ptr->Link[current->direction-1];     current->pnext=NULL;                           psnewaf->pnext=current;                           current->pbefore=psnewaf;                                       psnewbe=psnewaf;                           psnewaf=current;  }     else {     psnewaf->direction=Search(ptr, d);     interval=ptr->Link[psnewaf->direction-1]; }     ptr=interval;     d=0;     k++; if (k==plies)  //抵达第plies层 { count++; if (ptr->data==m)   //在plies层找到m项 { (*number)++; printf("第%d个%d结点位于第%d层上从左自由数起第%d个位置\n", *number, m, plies, count);  //输出找到的m项位置 if (*Location==before)  //到达链表块尾部,链表块中结点位置输出完毕 { *Location=(*Location)->next;  //*Location指向下一链表块第一个结点 return; } *Location=(*Location)->next;   //递进至本链表块下一结点 } ptr=psnewaf->current; d=psnewaf->direction; k--; }     continue;}}}}}int Search(TreeNode1 *ptr, int d){int m=d;for(m++; m<=K; m++){if (Enable(ptr, m)==1)return m;}return 0;}int Enable(TreeNode1 *ptr, int m){if (ptr->Link[m-1]!=NULL)return 1;elsereturn 0;}

输入及运行结果:



问题:K叉树结点总数并输出所有结点值

解答(C语言)

#include <stdio.h>#include <malloc.h>#define K 4struct TreeNode{int data;struct TreeNode *Link[K];};typedef struct TreeNode TreeNode1;struct Path{TreeNode1 *current;int direction;    struct Path *pnext, *pbefore;};typedef struct Path Path1;struct SearchNode{int value;int plies;TreeNode1 *goal;TreeNode1 *before;struct SearchNode *next;};typedef struct SearchNode SearchNode1;SearchNode1 *ComputeLeaf(TreeNode1 *root, int *count);    //函数用于求节点总数,返回SearchNode1链表头结点int Search(TreeNode1 *ptr, int d);int Enable(TreeNode1 *ptr, int m);void main(){int i, count; //count记录结点总数SearchNode1 *head, *before, *after;    TreeNode1 *temp1, *temp2;TreeNode1 *root=(TreeNode1 *) malloc(sizeof(TreeNode1));root->data=0;root->Link[0]=NULL;for(i=1; i<=3; i++){root->Link[i]=(TreeNode1 *) malloc(sizeof(TreeNode1));root->Link[i]->data=i;}for (i=1; i<=4; i++)root->Link[1]->Link[i-1]=NULL;temp1=root->Link[2];for (i=1; i<=4; i++){temp1->Link[i-1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp1->Link[i-1]->data=i+3;}temp2=temp1->Link[0];temp2->Link[1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[1]->data=10;for (i=1; i<=4; i++)temp2->Link[1]->Link[i-1]=NULL;    temp2->Link[3]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[3]->data=11;for (i=1; i<=4; i++)temp2->Link[3]->Link[i-1]=NULL;temp2->Link[0]=temp2->Link[2]=NULL;temp2=temp1->Link[2];temp2->Link[2]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2->Link[2]->data=12;for (i=1; i<=4; i++)temp2->Link[2]->Link[i-1]=NULL;temp2->Link[0]=temp2->Link[1]=temp2->Link[3]=NULL;temp2=temp1->Link[1];for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp2=temp1->Link[3];for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1=root->Link[3];temp1->Link[1]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2=temp1->Link[1];temp2->data=8;for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1->Link[3]=(TreeNode1 *) malloc(sizeof(TreeNode1));temp2=temp1->Link[3];temp2->data=9;for (i=1; i<=4; i++)temp2->Link[i-1]=NULL;temp1->Link[0]=temp1->Link[2]=NULL;head=ComputeLeaf(root, &count);before=head;after=head->next;i=0;while (after!=NULL){if (before->plies<after->plies)     //按层数有小到大每层从左至右顺序输出所有结点值{if (before!=head){printf("\n");}i++;printf("K叉树的第%d行从左至右为:", i);printf(" %d", after->value);}else{printf(" %d", after->value);}after=after->next;before=before->next;}printf("\n");printf("K叉树中共有%d个节点\n", count);   //输出结点总数}SearchNode1 *ComputeLeaf(TreeNode1 *root, int *count){int i;SearchNode1 *head1, *psnew1, *after, *before;head1=(SearchNode1 *) malloc(sizeof(SearchNode1));head1->next=NULL;head1->plies=0;for (i=1; i<=K; i++){if (root->Link[i-1]!=NULL)break;}psnew1=(SearchNode1 *) malloc(sizeof(SearchNode1));psnew1->value=root->data;    psnew1->plies=1;    psnew1->goal=root;          //将根节点插入SearchNode1链表psnew1->before=NULL;    psnew1->next=NULL;head1->next=psnew1;if (i>K)   //空树{ (*count)=1;   //节点总数为1 return head1;}else{ int d, k;     TreeNode1 *ptr, *interval; ptr=root;     d=0; *count=1; k=1;     Path1 *psnewbe, *psnewaf, *head, *current;           head=(Path1 *) malloc(sizeof(Path1));           psnewbe=head;           psnewaf=head;                      head->pnext=NULL;           head->pbefore=NULL; while(1){if (Search(ptr, d)==0){if (ptr==root)break;else{if (d==0){k--;ptr=psnewaf->current;d=psnewaf->direction;continue;}else{k--;free(psnewaf);psnewbe->pnext=NULL;                          psnewaf=psnewbe;                                           psnewbe=psnewbe->pbefore;ptr=psnewaf->current;d=psnewaf->direction;continue;}}}else{    if (d==0){current=(Path1 *) malloc(sizeof(Path1));                    current->current=ptr;current->direction=Search(ptr, d);interval=ptr->Link[current->direction-1];current->pnext=NULL;                      psnewaf->pnext=current;                      current->pbefore=psnewaf;                                  psnewbe=psnewaf;                      psnewaf=current; }else{psnewaf->direction=Search(ptr, d);interval=ptr->Link[psnewaf->direction-1];}ptr=interval;            //找到K叉树中新节点d=0;k++;(*count)++;   //计数变量加一psnew1=(SearchNode1 *) malloc(sizeof(SearchNode1));            psnew1->value=ptr->data;         //建立与新节点对应的SearchNode1结点                psnew1->plies=k;                psnew1->goal=ptr;psnew1->before=psnewaf->current;before=head1;after=head1->next;while (after!=NULL){if (before->plies<after->plies){if (psnew1->plies<after->plies){psnew1->next=before->next;      //将SearchNode1结点插入至SearchNode1链表中,确保插入后链表中相同层数的结点所属的块按层数大小以从小到大顺序从左至右排列,且每个块中各节点排列顺序与他们在树的同一层中出现的顺序一致before->next=psnew1;break;}}after=after->next;before=before->next;}if(after==NULL){psnew1->next=NULL;before->next=psnew1;}continue;}}return head1;}}int Search(TreeNode1 *ptr, int d){int m=d;for(m++; m<=K; m++){if (Enable(ptr, m)==1)return m;}return 0;}int Enable(TreeNode1 *ptr, int m){if (ptr->Link[m-1]!=NULL)return 1;elsereturn 0;}

运行结果: