主题:[讨论]大虾们帮我看看着个程序有什么错误
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#define N 100
typedef struct node{
int data;
struct node *left;
struct node *right;
} NODE;
NODE *root,*root1;
int intree[N],pretree[N],posttree[N];
int pre,in,post;
void createtree()
{
NODE *node,*p;
int data;
printf("\nEnter some numbers(end of 0):");
root=(NODE *)malloc(sizeof(NODE));
scanf("%d",&data);
root->data = data;
root->left = NULL;
root->right = NULL;
if(data)
{ scanf("%d",&data);
while(data)
{
node=(NODE *)malloc(sizeof(NODE));
node->data = data;
node->left = NULL;
node->right = NULL;
p=root;
while((p->left && data < p->data) || (p->right && data >= p->data) )
if(p->left && data < p->data ) p=p->left ;
else if(p->right && data >= p->data ) p=p->right ;
if(data < p->data) p->left = node;
else if(data >= p->data ) p->right = node;
scanf("%d",&data);
}
}
}
void preprinttree(NODE *tree)
{
if(tree)
{
printf("%3d",tree->data );
preprinttree(tree->left);
preprinttree(tree->right);
}
}
void inprinttree(NODE *tree)
{
if(tree)
{
inprinttree(tree->left);
printf("%3d",tree->data );
inprinttree(tree->right);
}
}
void postprinttree(NODE *tree)
{
if(tree)
{
postprinttree(tree->left);
postprinttree(tree->right);
printf("%3d",tree->data );
}
}
int treedeep(NODE *tree)
{ /*计算树的深度*/
int left=0,right=0;
if(!tree) return 0;
else
{
left=treedeep(tree->left); /*左子树的深度*/
right=treedeep(tree->right); /*右子树的深度*/
if(left>right) return (left+1); /*返回整个树的深度*/
else return (right+1);
}
}
void printtree(NODE *tree,int x,int y)
{ int deep,k=1,sign=0;
deep=treedeep(tree);
if(tree)
{
gotoxy(x,y);
printf("%d",tree->data);
while(deep>2){ k=k*2;deep--;}
deep=k;
if(k/4) sign=1;
if(tree->left)
{
gotoxy(x-k,y+1+sign);
printf("/");
if(sign){
gotoxy(x-k+1,y+sign);
while((deep--)>2) printf("-");
}
printtree(tree->left,x-k,y+2+sign);
}
if(tree->right)
{
if(sign){
gotoxy(x+2,y+1);
deep=k;
while((deep--)>2) printf("-");
}
gotoxy(x+k,y+1+sign);
printf("\\");
printtree(tree->right,x+k,y+2+sign);
}
}
}
void print(NODE *tree,int x, int y)
{
clrscr();
printtree(tree,x,y);
gotoxy(20,25);
printf("Press any key to continue...");
getche();
return;
}
NODE *prein_tree(NODE *tree,int i, int j,int i1,int j1)
{
int num=0;
if(i<=j)
{
tree=(NODE *)malloc(sizeof(NODE));
tree->data=pretree[i];
while(intree[i1+num]!=pretree[i] && num<j-i+1) num++;
if(num<j-i+1)
{
tree->left=prein_tree(tree->left,i+1,i+num,i1,i1+num-1);
tree->right=prein_tree(tree->right,i+num+1,j,i1+num+1,j1);
return tree;
}
}
return NULL;
}
NODE *postin_tree(NODE *tree,int i, int j,int i1,int j1)
{
int num=0;
if(i<=j)
{
tree=(NODE *)malloc(sizeof(NODE));
tree->data=posttree[j];
while(intree[i1+num]!=posttree[j] && num<j-i+1) num++;
if(num<j-i+1)
{
tree->left=postin_tree(tree->left,i,i+num-1,i1,i1+num-1);
tree->right=postin_tree(tree->right,i+num,j-1,i1+num+1,j1);
return tree;
}
}
return NULL;
}
freetree(NODE *tree)
{ NODE *left,*right;
if(tree)
{ left=tree->left;
right=tree->right;
free(tree);
freetree(left);
freetree(right);
}
}
void pre_in_post_tree()
{
int choice,temp;
clrscr();
printf("\n\t1.input pre_root tree");
printf("\n\t2.input post_root tree");
do{
printf("\n\tYour choice:");
scanf("%d",&choice);
}while(choice<1 ||choice>2);
pre=in=post=0;
printf("\n\tinput in_tree list(end of 0):");
scanf("%d",&temp);
while(temp)
{ intree[in]=temp;
in++;
scanf("%d",&temp);
}
switch(choice)
{
case 1: freetree(root1);
printf("\n\tinput pre_tree list(end of 0):");
scanf("%d",&temp);
while(temp)
{ pretree[pre]=temp;
pre++;
scanf("%d",&temp);
}
root1=prein_tree(root,0,pre-1,0,in-1);
printtree(root1,40,12);
break;
case 2: freetree(root1);
printf("\n\tinput post_tree list(end of 0):");
scanf("%d",&temp);
while(temp)
{ posttree[post]=temp;
post++;
scanf("%d",&temp);
}
root1=postin_tree(root1,0,post-1,0,in-1);
printtree(root1,40,12);
break;
default: break;
}
}
void del_node(NODE *tree)
{ /*在以tree为根的可查找二叉树中删除一个指定的节点*/
int data,left=-1;
NODE *p=tree,*p_parent=p,*p1,*p1_parent;
printf("\n\tEnter a number to delete:");
scanf("%d",&data);
while(p->data!=data && p)
{
p_parent=p;
if(p->data > data)
{ p=p->left;
left=1;
}
else
{
p=p->right;
left=0;
}
}/*在整个二叉树中查找要删除的节点*/
if(p) /*while退出时,如果p非空,说明在二叉树中data找到,即p是要删除的节点*/
{
if(p->left && p->right)/*如果左右子树均非空,则在左子树中找一个最大的值去替代*/
{ p1=p->left; /*p1记录左子树的根,p1_parent为p1节点的父节点*/
p1_parent=p;
while(p1->right) /*while退出时,p1中的值即为最大的值,用来替代要删除节点p中的内容*/
{ p1_parent=p1; /*然后把p1节点释放掉,显然while退出时p1的右子树为空*/
p1=p1->right;
}
p->data=p1->data;/*将左子树中最大的值移到p节点内,相当于将原来的p节点内容清空,即删除*/
if(p1_parent==p) p1_parent->left=p1->left;
/*p1节点的内容已经移动到p内,所以要释放p1节点,如果p1节点刚好是p的左子树根节点*/
/*在释放之前要将p1的左子树记录到p的left变量中*/
else p1_parent->right=p1->left;/*否则,记录到p1的父节点right变量中*/
free(p1);
}
else if(p_parent==p)/*前面的if条件不成立,则要删除的p节点至多只有一个子树,根据初始化的值*/
{ /*此条件即判断出是删除根节点*/
p1=NULL;
if(p->left) p1=p->left; /*如果根节点的左子树非空,则用p1记录,同时其右子树肯定是空*/
if(p->right) p1=p->right; /*的,将根节点p直接释放空间,然后让p记录p1的值。如果p的left*/
free(p); /*和right均为空,则该树只有根节点,释放后为空树,所以p1初始*/ /*化为NULL*/
p=p1;
}
else if(!p->left)
{
if(left==1) p_parent->left=p->right;
if(left==0) p_parent->right=p->right;
free(p);
}
else if(!p->right)
{
if(left==1) p_parent->left=p->left;
if(left==0) p_parent->right=p->left;
free(p);
}
}
else
{
printf("\nSorry,can't find the number %d in the tree!",data);
getche();
}
}
int CompareTree(NODE *tree1,NODE *tree2)
{ int left,right;
if(tree1 && tree2)
{
if(tree1->data!=tree2->data) return 0;
else
{
left=CompareTree(tree1->left,tree2->left);
right=CompareTree(tree1->right,tree2->right);
if(left&&right) return 1;
else return 0;
}
}
else if(!tree1 && !tree2) return 1;
else return 0;
}
void main(void)
{
int choice,whichtree=0;
clrscr();
printf("\n\t\t-------------------------------\n");
printf("\t\t| The Menu |\n");
printf("\t\t| 1.Create a tree |\n");
printf("\t\t| 2.pre/in/post tree |\n");
printf("\t\t| 3.Print the tree |\n");
printf("\t\t| 4.del a node |\n");
printf("\t\t| 5.compare 2 trees |\n");
printf("\t\t| 6.exit |\n");
printf("\t\t| Choose: |\n");
printf("\t\t-------------------------------\n");
do
{ gotoxy(31,10);
scanf("%d",&choice);
}while(choice<1 || choice>6);
do{
switch(choice)
{
case 1: freetree(root);
createtree();
whichtree=0;
printf("\nPre-print-tree:");
preprinttree(root);
printf("\nIn-print-tree:");
inprinttree(root);
printf("\nPost-print-tree:");
postprinttree(root);
getche();
break;
case 2: pre_in_post_tree();
whichtree=1;
getche();
break;
case 3: if(whichtree==1) print(root1,40,1);
else print(root,40,1);
break;
case 4: del_node(root);
break;
case 5: if(CompareTree(root,root1)) printf("\nThe 2 tree is the same");
else printf("\nThe 2 tree is different!");
getche();
break;
case 6: printf("\n\n\n\t\tThanks,Good Bye!");
exit(0);
break;
default: break;
}
clrscr();
gotoxy(1,1);
printf("\n\t\t-------------------------------\n");
printf("\t\t| The Menu |\n");
printf("\t\t| 1.Create a tree |\n");
printf("\t\t| 2.pre/in/post tree |\n");
printf("\t\t| 3.Print the tree |\n");
printf("\t\t| 4.del a node |\n");
printf("\t\t| 5.compare 2 trees |\n");
printf("\t\t| 6.exit |\n");
printf("\t\t| Choose: |\n");
printf("\t\t-------------------------------\n");
do
{ gotoxy(31,10);
scanf("%d",&choice);
}while(choice<1 || choice>6);
}while(choice!=6);
}
[size=1]#include<stdio.h>[/size][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1]
#include<stdlib.h>
#include<conio.h>
#include<graphics.h>
#define N 100
typedef struct node{
int data;
struct node *left;
struct node *right;
} NODE;
NODE *root,*root1;
int intree[N],pretree[N],posttree[N];
int pre,in,post;
void createtree()
{
NODE *node,*p;
int data;
printf("\nEnter some numbers(end of 0):");
root=(NODE *)malloc(sizeof(NODE));
scanf("%d",&data);
root->data = data;
root->left = NULL;
root->right = NULL;
if(data)
{ scanf("%d",&data);
while(data)
{
node=(NODE *)malloc(sizeof(NODE));
node->data = data;
node->left = NULL;
node->right = NULL;
p=root;
while((p->left && data < p->data) || (p->right && data >= p->data) )
if(p->left && data < p->data ) p=p->left ;
else if(p->right && data >= p->data ) p=p->right ;
if(data < p->data) p->left = node;
else if(data >= p->data ) p->right = node;
scanf("%d",&data);
}
}
}
void preprinttree(NODE *tree)
{
if(tree)
{
printf("%3d",tree->data );
preprinttree(tree->left);
preprinttree(tree->right);
}
}
void inprinttree(NODE *tree)
{
if(tree)
{
inprinttree(tree->left);
printf("%3d",tree->data );
inprinttree(tree->right);
}
}
void postprinttree(NODE *tree)
{
if(tree)
{
postprinttree(tree->left);
postprinttree(tree->right);
printf("%3d",tree->data );
}
}
int treedeep(NODE *tree)
{ /*计算树的深度*/
int left=0,right=0;
if(!tree) return 0;
else
{
left=treedeep(tree->left); /*左子树的深度*/
right=treedeep(tree->right); /*右子树的深度*/
if(left>right) return (left+1); /*返回整个树的深度*/
else return (right+1);
}
}
void printtree(NODE *tree,int x,int y)
{ int deep,k=1,sign=0;
deep=treedeep(tree);
if(tree)
{
gotoxy(x,y);
printf("%d",tree->data);
while(deep>2){ k=k*2;deep--;}
deep=k;
if(k/4) sign=1;
if(tree->left)
{
gotoxy(x-k,y+1+sign);
printf("/");
if(sign){
gotoxy(x-k+1,y+sign);
while((deep--)>2) printf("-");
}
printtree(tree->left,x-k,y+2+sign);
}
if(tree->right)
{
if(sign){
gotoxy(x+2,y+1);
deep=k;
while((deep--)>2) printf("-");
}
gotoxy(x+k,y+1+sign);
printf("\\");
printtree(tree->right,x+k,y+2+sign);
}
}
}
void print(NODE *tree,int x, int y)
{
clrscr();
printtree(tree,x,y);
gotoxy(20,25);
printf("Press any key to continue...");
getche();
return;
}
NODE *prein_tree(NODE *tree,int i, int j,int i1,int j1)
{
int num=0;
if(i<=j)
{
tree=(NODE *)malloc(sizeof(NODE));
tree->data=pretree[i];
while(intree[i1+num]!=pretree[i] && num<j-i+1) num++;
if(num<j-i+1)
{
tree->left=prein_tree(tree->left,i+1,i+num,i1,i1+num-1);
tree->right=prein_tree(tree->right,i+num+1,j,i1+num+1,j1);
return tree;
}
}
return NULL;
}
NODE *postin_tree(NODE *tree,int i, int j,int i1,int j1)
{
int num=0;
if(i<=j)
{
tree=(NODE *)malloc(sizeof(NODE));
tree->data=posttree[j];
while(intree[i1+num]!=posttree[j] && num<j-i+1) num++;
if(num<j-i+1)
{
tree->left=postin_tree(tree->left,i,i+num-1,i1,i1+num-1);
tree->right=postin_tree(tree->right,i+num,j-1,i1+num+1,j1);
return tree;
}
}
return NULL;
}
freetree(NODE *tree)
{ NODE *left,*right;
if(tree)
{ left=tree->left;
right=tree->right;
free(tree);
freetree(left);
freetree(right);
}
}
void pre_in_post_tree()
{
int choice,temp;
clrscr();
printf("\n\t1.input pre_root tree");
printf("\n\t2.input post_root tree");
do{
printf("\n\tYour choice:");
scanf("%d",&choice);
}while(choice<1 ||choice>2);
pre=in=post=0;
printf("\n\tinput in_tree list(end of 0):");
scanf("%d",&temp);
while(temp)
{ intree[in]=temp;
in++;
scanf("%d",&temp);
}
switch(choice)
{
case 1: freetree(root1);
printf("\n\tinput pre_tree list(end of 0):");
scanf("%d",&temp);
while(temp)
{ pretree[pre]=temp;
pre++;
scanf("%d",&temp);
}
root1=prein_tree(root,0,pre-1,0,in-1);
printtree(root1,40,12);
break;
case 2: freetree(root1);
printf("\n\tinput post_tree list(end of 0):");
scanf("%d",&temp);
while(temp)
{ posttree[post]=temp;
post++;
scanf("%d",&temp);
}
root1=postin_tree(root1,0,post-1,0,in-1);
printtree(root1,40,12);
break;
default: break;
}
}
void del_node(NODE *tree)
{ /*在以tree为根的可查找二叉树中删除一个指定的节点*/
int data,left=-1;
NODE *p=tree,*p_parent=p,*p1,*p1_parent;
printf("\n\tEnter a number to delete:");
scanf("%d",&data);
while(p->data!=data && p)
{
p_parent=p;
if(p->data > data)
{ p=p->left;
left=1;
}
else
{
p=p->right;
left=0;
}
}/*在整个二叉树中查找要删除的节点*/
if(p) /*while退出时,如果p非空,说明在二叉树中data找到,即p是要删除的节点*/
{
if(p->left && p->right)/*如果左右子树均非空,则在左子树中找一个最大的值去替代*/
{ p1=p->left; /*p1记录左子树的根,p1_parent为p1节点的父节点*/
p1_parent=p;
while(p1->right) /*while退出时,p1中的值即为最大的值,用来替代要删除节点p中的内容*/
{ p1_parent=p1; /*然后把p1节点释放掉,显然while退出时p1的右子树为空*/
p1=p1->right;
}
p->data=p1->data;/*将左子树中最大的值移到p节点内,相当于将原来的p节点内容清空,即删除*/
if(p1_parent==p) p1_parent->left=p1->left;
/*p1节点的内容已经移动到p内,所以要释放p1节点,如果p1节点刚好是p的左子树根节点*/
/*在释放之前要将p1的左子树记录到p的left变量中*/
else p1_parent->right=p1->left;/*否则,记录到p1的父节点right变量中*/
free(p1);
}
else if(p_parent==p)/*前面的if条件不成立,则要删除的p节点至多只有一个子树,根据初始化的值*/
{ /*此条件即判断出是删除根节点*/
p1=NULL;
if(p->left) p1=p->left; /*如果根节点的左子树非空,则用p1记录,同时其右子树肯定是空*/
if(p->right) p1=p->right; /*的,将根节点p直接释放空间,然后让p记录p1的值。如果p的left*/
free(p); /*和right均为空,则该树只有根节点,释放后为空树,所以p1初始*/ /*化为NULL*/
p=p1;
}
else if(!p->left)
{
if(left==1) p_parent->left=p->right;
if(left==0) p_parent->right=p->right;
free(p);
}
else if(!p->right)
{
if(left==1) p_parent->left=p->left;
if(left==0) p_parent->right=p->left;
free(p);
}
}
else
{
printf("\nSorry,can't find the number %d in the tree!",data);
getche();
}
}
int CompareTree(NODE *tree1,NODE *tree2)
{ int left,right;
if(tree1 && tree2)
{
if(tree1->data!=tree2->data) return 0;
else
{
left=CompareTree(tree1->left,tree2->left);
right=CompareTree(tree1->right,tree2->right);
if(left&&right) return 1;
else return 0;
}
}
else if(!tree1 && !tree2) return 1;
else return 0;
}
void main(void)
{
int choice,whichtree=0;
clrscr();
printf("\n\t\t-------------------------------\n");
printf("\t\t| The Menu |\n");
printf("\t\t| 1.Create a tree |\n");
printf("\t\t| 2.pre/in/post tree |\n");
printf("\t\t| 3.Print the tree |\n");
printf("\t\t| 4.del a node |\n");
printf("\t\t| 5.compare 2 trees |\n");
printf("\t\t| 6.exit |\n");
printf("\t\t| Choose: |\n");
printf("\t\t-------------------------------\n");
do
{ gotoxy(31,10);
scanf("%d",&choice);
}while(choice<1 || choice>6);
do{
switch(choice)
{
case 1: freetree(root);
createtree();
whichtree=0;
printf("\nPre-print-tree:");
preprinttree(root);
printf("\nIn-print-tree:");
inprinttree(root);
printf("\nPost-print-tree:");
postprinttree(root);
getche();
break;
case 2: pre_in_post_tree();
whichtree=1;
getche();
break;
case 3: if(whichtree==1) print(root1,40,1);
else print(root,40,1);
break;
case 4: del_node(root);
break;
case 5: if(CompareTree(root,root1)) printf("\nThe 2 tree is the same");
else printf("\nThe 2 tree is different!");
getche();
break;
case 6: printf("\n\n\n\t\tThanks,Good Bye!");
exit(0);
break;
default: break;
}
clrscr();
gotoxy(1,1);
printf("\n\t\t-------------------------------\n");
printf("\t\t| The Menu |\n");
printf("\t\t| 1.Create a tree |\n");
printf("\t\t| 2.pre/in/post tree |\n");
printf("\t\t| 3.Print the tree |\n");
printf("\t\t| 4.del a node |\n");
printf("\t\t| 5.compare 2 trees |\n");
printf("\t\t| 6.exit |\n");
printf("\t\t| Choose: |\n");
printf("\t\t-------------------------------\n");
do
{ gotoxy(31,10);
scanf("%d",&choice);
}while(choice<1 || choice>6);
}while(choice!=6);
}
[size=1]#include<stdio.h>[/size][em1][em1][em1][em1][em1][em1][em1][em1][em1][em1]