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;}
运行结果:
阅读全文
0 0
- K叉树的运算
- 将bst树选择运算的非递归实现-获取第k个元素值
- 关于位运算寻找数组中出现k次的数的方法
- 对K&R里按位运算的getbits(x, p, n)函数的理解
- 趣题:用位运算生成下一个含有k个1的二进制数
- 趣题:用位运算生成下一个含有k个1的二进制数(转载)
- 趣题:用位运算生成下一个含有k个1的二进制数
- 趣题:用位运算生成下一个含有k个1的二进制数
- 用位运算生成下一个含有k个1的二进制数
- 翻转链表查找链表的倒数第k个节点位运算加法
- k近邻算法——k-d 树的实现
- HDU 6121 K叉树的异或值和
- k++与++k的总结
- 位运算---在其他数都出现k次的数组中找到只出现一次的数
- 二叉树的基本运算
- 线索二叉树的运算
- 二叉树的基本运算
- 二叉树的一些运算
- CentOS7 开启网卡自动获取IP
- 公开课可下载资源汇总
- javafx加载不同包中的fxml文件
- 选项卡的制作和数组
- 国庆清北刷题冲刺班 Day2 下午
- K叉树的运算
- hdu5952 Counting Cliques(爆搜)
- redis在spring中的使用
- 微信小程序设置cookie
- java中的异常是什么?
- Tyvj 1072 LCIS
- No.9 数据工程师该如何入门?
- 2016 四川省赛 H AroundtheWorld(BEST定理)
- XAMPP APACHE Error: Apache shutdown unexpectedly