做个循环,当是你要的答案的时候
break
就可以了
c语言问题
仔细检查过了。程序逻辑上没有问题。不过我的VC上要把所有的null都改为NULL才行,另外还有些中文字符,引号之类的小问题。
在创建二叉树的过程中,由第34行可知,实际上根的指针为数组temp的元素temp[1],而temp的定义最好改为temp[MAXSIZE+1]。不过不改也没什么,就是能输入树的节点个数最多为MAXSIZE-1而已,要清楚这点。
在原来程序上添加了注释,在分配内存后加了失败检查。楼主说的i--部分不会造成死循环,只要你在输入节点数据时能保证其父亲节点在这之前都已经输入(temp对应元素不为NULL)就行。所以最好从上到下,从左到右依次输入节点数据。
修改后程序(添加了遍历程序,以便主函数检查树的创建是否成功):
#include"stdio.h"
#include"stdlib.h"
#defineMAXSIZE
typedefcharElemtype;
structtree_nodeElemtypedata;
structtree_node*lch,*rch;
};//创建二叉树节点类型
/*create_tree创建一棵二叉树,不一定是完全树*/
structtree_node*create_tree()//创建一棵树
{//树的根从编号1开始。回头返回时数组撤销,但是树还在
structtree_node*t,*p,*temp[MAXSIZE+1];
inti,j,n,f;
Elemtypex;
for(i=1;i<=MAXSIZE;i++)//所有节点都置空
temp[i]=NULL;
printf("输入节点数");
scanf("%d",&n);
for(i=1;i<=n;i++)printf("输入节点序号和节点值:");//必须由根到叶创建节点
scanf("%d,%c",&j,&x);//编号,取值对
if(temp[j/2]==NULL)//因为是二叉树,每个节点一定有父亲节点printf("输节点错误,请重新输入");
i--;//要和for后面的i++抵消,原地重新输入节点,所以要--
continue;//重新进入输入环节。p=(structtree_node*)malloc(sizeof(structtree_node));//创建一个节点
if(!p)returnNULL;
p->data=x;//新建的节点的数据值
p->lch=NULL;//俩指针都指向NULL
p->rch=NULL;
temp[j]=p;//把p挂到树上指定位置。
if(j==1)//树根。t指向树根。回头函数返回t即可返回这棵树。
t=p;
elsef=j/2;
if(j%2==0)
temp[f]->lch=p;//挂左边
else
temp[f]->rch=p;//挂右边return(t);/*LDR:二叉树中序遍历*/
voidLDR(structtree_node*tree)if(!tree)return;
LDR(tree->lch);
printf("%c",tree->data);
LDR(tree->rch);
return;/*LRD:二叉树后序遍历*/
voidLRD(structtree_node*tree)if(!tree)return;
LRD(tree->lch);
LRD(tree->rch);
printf("%c",tree->data);
return;/*DLR:二叉树先序遍历*/
voidDLR(structtree_node*tree)if(!tree)return;
printf("%c",tree->data);
DLR(tree->lch);
DLR(tree->rch);
return;intmain()structtree_node*tree=create_tree();
printf("二叉树中序遍历结果:");
LDR(tree);
printf("\n");
printf("二叉树先序遍历结果:");
DLR(tree);
printf("\n");
printf("二叉树后序遍历结果:");
LRD(tree);
printf("\n");
return0;
3515

被折叠的 条评论
为什么被折叠?



