实现二叉树管理系统,函数中查找和插入两个函数正确,放到主函数中就运行不出来,是界面的第5.6个功能.求大佬指导.
#include<stdio.h>
#include<string.h>
typedef int elem;
#define max 20
//-------------------------
typedef struct node
{
elem data;
node* left;
node* right;
}node,*Tnode;
typedef struct
{
elem data[max];
int front;
int rear;
int size;
}queue;
//------------------------
int initqueue(queue &s)
{
s.front = s.rear = 0;
s.size = max;
return 1;
}
int queueempty(queue s)
{
if (s.front == s.rear)
return 1;
else
return 0;
}
elem queuehead(queue s)
{
if (s.front == s.rear)
return -1;
else
return s.data[s.front];
}
int enqueue(queue &s, elem e)
{
if ((s.rear + 1) % s.size == s.front)
return 0;
else
{
s.data[s.rear] = e;
s.rear = (s.rear + 1) % s.size;
return 1;
}
}
elem dequeue(queue &s)
{
if (s.front == s.rear)
return -1;
else
{
elem e=s.data [s.front ];
s.front = (s.front + 1) % s.size;
return e;
}
}
void queueplay(queue s)
{
int p = s.front;
while (p != s.rear % s.size)
{
printf("%d ",s.data [p]);
p = (p + 1) % s.size;
}
}
//----------------------
typedef struct trnode
{
char data;
trnode* left;
trnode* right;
}trnode,*Trnode;
//----------------------
typedef struct qnode
{
Trnode data;
qnode* left;
qnode* right;
}qnode,*qTnode;
typedef struct
{
Trnode data[max];
int front;
int rear;
int size;
}qqueue;
//------------------------
int qqueueempty(qqueue s)
{
if (s.front == s.rear)
return 1;
else
return 0;
}
int qinitqueue(qqueue &s)
{
s.front = s.rear = 0;
s.size = max;
return 1;
}
int qenqueue(qqueue &s, Trnode e)
{
if ((s.rear + 1) % s.size == s.front)
return 0;
else
{
s.data[s.rear] = e;
s.rear = (s.rear + 1) % s.size;
return 1;
}
}
Trnode qdequeue(qqueue &s)
{
if (s.front == s.rear)
return NULL;
else
{
Trnode e=s.data [s.front ];
s.front = (s.front + 1) % s.size;
return e;
}
}
//--------------------------
typedef struct snode
{
char data;
snode* next;
}snode, *Linkstack;
Linkstack init()
{
Linkstack a;
a = NULL;
return a;
}
int push(Linkstack &a, char e)
{
Linkstack p = new snode;
p->data = e;
p->next = a;
a = p;
//printf("进栈成功");
return 1;
}
char gettop(Linkstack a)
{
char e;
if (a == NULL)
{
// printf("栈空!");
return NULL;
}
else
{
e = a->data;
return e;
}
}
int length(Linkstack a)
{
Linkstack p=a;
int i=0;
while(p)
{
p=p->next ;
i++;
}
return i;
}
char pop(Linkstack &a)
{
char e;
if(a==NULL)
{
//printf("栈空");
return NULL;
}
if(length(a)==1)
{
e=a->data ;
a=NULL;
//printf("出栈成功");
return e;
}
else
{
Linkstack p=a->next ;
e=a->data ;
delete a;
a=p;
//printf("出栈成功");
return e;
}
}
int display(Linkstack a)
{
Linkstack p = a;
while (p)
{
printf("%c ", p->data);
p = p->next;
}
return 1;
}
char getbase(Linkstack a)
{
Linkstack p=a;
for(int i=1;i<length(a);i++)
{
p=p->next ;
}
return p->data ;
}
//-----------------------------
typedef struct ssnode
{
Trnode data;
ssnode* next;
}ssnode, *sLinkstack;
sLinkstack sinit()
{
sLinkstack a;
a = NULL;
return a;
}
int spush(sLinkstack &a, Trnode e)
{
sLinkstack p = new ssnode;
p->data = e;
p->next = a;
a = p;
//printf("进栈成功");
return 1;
}
int slength(sLinkstack a)
{
sLinkstack p=a;
int i=0;
while(p)
{
p=p->next ;
i++;
}
return i;
}
Trnode spop(sLinkstack &a)
{
Trnode e;
if(a==NULL)
{
//printf("栈空");
return NULL;
}
if(slength(a)==1)
{
e=a->data ;
a=NULL;
//printf("出栈成功");
return e;
}
else
{
sLinkstack p=a->next ;
e=a->data ;
delete a;
a=p;
//printf("出栈成功");
return e;
}
}
int sdisplay(sLinkstack a)
{
sLinkstack p = a;
while (p)
{
printf("%c", p->data);
p = p->next ;
}
return 1;
}
//---------------------------
//1.根据字符串创建树(先序)
void crttree(Trnode &T)
{
char ch;
scanf("%c",&ch);
if (ch == '#')
T = NULL;
else
{
T = new trnode;
T->data = ch;
if(T->left )
crttree(T->left);
if(T->right )
crttree(T->right);
// printf("1\n");
}
}
//---------------------------------
//2.先序遍历
void preorder(Trnode s)
{
if (s)
{
printf("%c ",s->data );
preorder(s->left);
preorder(s->right);
}
}
//----------------------------------
//0.1用先序和中序创建二叉树
Trnode createtree(char a[],char b[],int i,int j,int len)
{
Trnode root=new trnode;
if(len<=0)
return NULL;
else
{
root->data =a[i];
char *p=b;
for(p=b;p!=NULL;p++)
{
if(*p==a[i])
break;
}
int m=p-b;
root->left =createtree(a,b,i+1,j,m-j);
root->right =createtree(a,b,i+(m-j)+1,m+1,len-1-(m-j));
return root;
}
}
//------------------------------------
//0.2计算树的深度/高度
int length(Trnode s)
{
if(s==NULL)
return 0;
else if(s->left==NULL&&s->right==NULL)
return 1;
else
{
int m=length(s->left );
int n=length(s->right );
if(m<=n)
return n+1;
else
return m+1;
}
}
//----------------------------------
//0.3一次输出
void putnode(Trnode a)
{
int len;
if (a->left == NULL && a->right == NULL) {
len = 1;
}
else
{
len = length(a->left) + length(a->right);
}
for (int i = 1; i <= len; i++)
{
printf("%c", a->data);
}
printf("\n");
}
//-------------------------------------------------
//5.查找指定节点并返回其指针
Trnode find(Trnode s, char a)
{
Trnode h;
if (s)
{
if (a == s->data)
{
return s;
}
h = find(s->left, a);
if (h != NULL)
{
return h;
}
else
{
return find(s->right, a);
}
}
else
{
return NULL;
}
}
//------------------------------------------
//4. 层次遍历
void layer(Trnode s)
{
qqueue q;
qinitqueue(q);
if(s)
qenqueue(q,s);
while(!qqueueempty(q))
{
Trnode p;
p=qdequeue(q);
printf("%c",p->data);
if(p->left)
qenqueue(q,p->left);
if(p->right)
qenqueue(q,p->right);
}
}
//------------------------------------------
//0.4计算节点的深度
int depthnode(Trnode s,Trnode e)
{
if(s==NULL)
return 0;
if(s->data ==e->data )
return 1;
int l=depthnode(s->left ,e);
int r=depthnode(s->right ,e);
if(l||r)
{
if(l>r)
return l+1;
else
return r+1;
}
return -1;
}
//3.凹入输出
//----------------------------------------------------
//3.1
void ao(char a[],char b[])
{
int n=strlen(a);
Trnode s=createtree(a,b,0,0,n);//创建二叉树
for(int i=0;i<n;i++)
{
Trnode e=find(s,a[i]);
putnode(e);
}
}
//---------------------------------
//3.2课本
void aoo(Trnode t,int level)
{
int i,k;
if(t)
{
for(i=1;i<level;i++)
putchar(' ');
printf("%c",t->data );
for(k=i+4;k<20;k++)
putchar('-');
putchar('\n');
aoo(t->left ,level+2);
aoo(t->right ,level+2);
}
}
//----------------------------------------------
//0.5输出空格
void kong(Trnode s,Trnode a)
{
int len=depthnode(s,a);
for(int i=0;i<len-1;i++)
{
printf(" ");
}
printf("%c\n",a->data );
}
//3.3
//---------------------------------------
void aooo(char a[],char b[])
{
int n=strlen(a);
Trnode s=createtree(a,b,0,0,n);//创建二叉树
for(int i=0;i<n;i++)
{
Trnode e=find(s,b[i]);
kong(s,e);
}
}
//----------------------------------------------
//6.插入节点
int insertnode(Trnode &s,char a,int lrflag,char p)//二叉树,插入节点的双亲,插入节点是其左孩子/右孩子,插入节点
{
Trnode e=find(s,a);
Trnode q=new trnode;
if(!q)
return 0;
else
{
q->data =p;
q->left =q->right =NULL;
Trnode m=e->left ;
Trnode n=e->right ;
if(lrflag==1)//左孩子
{
q->left =m;
e->left =q;
}
else
{
q->right =m;
e->right =q;
}
printf("插入成功");
return 1;
}
}
//----------------------------------
//8.复制二叉树
Trnode copy(Trnode s)
{
if(s==NULL)
{
return NULL;
}
else
{
Trnode e=new trnode;
e->data =s->data ;
if(s->left )
e->left =copy(s->left );
else
e->left =NULL;
if(s->right)
e->right =copy(s->right );
else
e->right =NULL;
return e;
}
}
//-------------------------------------
//0.7找双亲
Trnode parent(Trnode s, Trnode a)
{
Trnode h;
if (s)
{
if (a == s->left||a==s->right)
{
return s;
}
h = parent(s->left, a);
if (h != NULL)
{
return h;
}
else
{
return parent(s->right, a);
}
}
else
{
return NULL;
}
}
//--------------------------------------------------
//7.删除节点
void deletenode(Trnode &s,char e)
{
Trnode t=find(s,e);
Trnode p=parent(s,t);
if(p==NULL)//根节点
{
printf("所删除节点为根节点\n");
s=NULL;
t->left=t->right =NULL;
t=NULL;
printf("删除成功\n");
return ;
}
else//叶子结点和非叶子结点
{
if(p->left==t)
{
p->left=NULL;
t->left =t->right =NULL;
delete t;
}
if(p->right==t)
{
p->right=NULL;
t->left =t->right =NULL;
delete t;
}
printf("删除成功\n");
}
}
//----------------------------------------------
//9.递归实现输出从根节点到叶子结点的所有路径
//0.8找叶子结点
sLinkstack sa=sinit();//叶子结点
void leaf(Trnode s)
{
if (s)
{
if(!s->left&&!s->right )
{
spush(sa,s);
}
leaf(s->left);
leaf(s->right);
}
}
//9.输出路径
void road(Trnode s)
{
while(slength(sa))
{
// printf("1\n");
Trnode t=spop(sa);
Trnode p=t;
sLinkstack x=sinit();
spush(x,t);
while(parent(s,p)!=NULL)
{
spush(x,parent(s,p));
p=parent(s,p);
}
while(slength(x))
{
Trnode q=spop(x);
printf("%c-",q->data);
// printf("3\n");
}
// printf("4\n");
printf("\n");
}
}
//--------------------------------------
int screen()
{
printf("---------------------------------------------\n\n");
printf(" 二叉树管理系统(字符串)\n");
printf("---------------------------------------------\n\n");
// printf(" 1-----先序字符串建立二叉树\n");
printf(" 2-----先序遍历输出\n");
printf(" 3-----凹入输出(三种输出形式)\n");
printf(" 4-----层次遍历输出\n");
printf(" 5-----查找结点\n");
printf(" 6-----插入结点\n");
printf(" 7-----删除结点\n");
printf(" 8-----复制二叉树\n");
printf(" 9-----输出路径\n");
// printf(" 10----找双亲结点\n");
// printf(" 11----计算结点深度\n");
// printf(" 12----用先序和中序创建二叉树\n");
printf(" 0-----退出\n");
// printf("---------------------------------------------\n");
printf(" 请输入对应数字\n");
// printf("---------------------------------------------\n");
//int key;
// scanf("%d",&key);
return 1;
}
int main()
{
char a[80];
char b[80];
int p;
Trnode s,cz,za,q,t;
int n,len,k;
char sc;
char sq,e,j,z;
int lrflag;
printf("请输入先序字符串:\n");
crttree(t);
printf("创建成功!\n");
while(p)
{
screen();
scanf("%d",&p);
switch(p)
{
case 2:
preorder(t);
break;
case 3:
{
printf("请输入先序字符串:\n");
scanf("%s",a);
printf("请输入中序字符串:\n");
scanf("%s",b);
if(strlen(a)!=strlen(b))
printf("输入错误!");
else
{
printf("\n第一种:\n");
ao(a,b);
printf("\n第二种:\n");
n=strlen(a);
s=createtree(a,b,0,0,n);
aoo(s,length(s));
printf("\n第三种:\n");
aooo(a,b);
printf("\n输出完毕\n");
}
}
break;
case 4:
{
layer(t);
printf("\n输出完毕\n");
break;
}
//--------------------------------------------
case 5://查找
{
printf("请输入要查找结点的字符值:");
char pp;
scanf("%c",&pp);
q=find(t,pp);
if(q!=NULL)
{
printf("已找到\n");
}
else
{
printf("该结点不存在\n");
}
break;
}
case 6://插入
printf("请依次输入所插入结点的双亲,属于左孩子/右孩子(1表示左孩子,0表示右孩子),插入的字符值,并用空格隔开:\n");
scanf("%c %d %c",&sq,&lrflag,&e);
k=insertnode(t,sq,lrflag,e);
if(k==1)
printf("插入成功\n");
else
printf("插入失败\n");
break;
case 7://删除
printf("请输入所需要删除结点的字符值:\n");
scanf("%c",&sc);
cz=find(t,sc);
if(cz==NULL)
printf("无所需要删除结点\n");
else
{
deletenode(t,sc);
printf("删除成功\n");
}
break;
//---------------------------------------------------------
case 8:
copy(t);
printf("复制成功\n");
break;
case 9:
//路径
printf("所有路径为:\n");
leaf(t);
road(t);
break;
case 10://shuangqin
printf("请输入结点字符值:\n");
scanf("%c",&z);
za=parent(t,find(t,z));
printf("其双亲为%c",za->data );
break;
case 11://jisuan jiedian shendu
printf("请输入结点字符值:\n");
j;
scanf("%c",&j);
len=depthnode(t,find(t,j));
printf("结点深度为%d\n",len);
break;
default:printf("输出错误!");
break;
}
}
return 0;
}
你看看函数在那里调用了,参数设置和返回值对不对
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
也许对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y