| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 373 人关注过本帖
标题:求大神指点!!!!根据中序后序构造二叉树,若构造失败,怎么设置报错
只看楼主 加入收藏
小淡定ZT
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-3-7
  问题点数:0  回复次数:0   
求大神指点!!!!根据中序后序构造二叉树,若构造失败,怎么设置报错
/*
给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度<=8)。
输入格式:两行,每行一个字符串,分别表示中序和后序排列
输出格式:一个字符串,表示所求先序排列
样例输入
BADC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADEFGHMZ
BDCA&nbsp;&nbsp;&nbsp; AEFDHZMG
样例输出
ABCD&nbsp;&nbsp;&nbsp; GDAFEMHZ
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node//定义存储结构
{
&nbsp;&nbsp;&nbsp; char data;
&nbsp;&nbsp;&nbsp; struct node *lchild, *rchild;
};
char s1[50], s2[50];//s1指的是中序,s2指后序排列
struct node *creat(int length, char *s1, char *s2)//根据二叉树的后序序列和中序序列创建二叉树
{//s2存放后序序列,s1存放中序序列,length为二叉树结点个数
&nbsp;&nbsp;&nbsp; int i;
&nbsp;&nbsp;&nbsp; if(length == 0)//判断输入的字符是否为空
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return NULL;
&nbsp;&nbsp;&nbsp; struct node *root;//定义一个指向node类型的指针root
&nbsp;&nbsp;&nbsp; root = (struct node*)malloc(sizeof(struct node));//在内存中为root分配一个动态的存储空间
&nbsp;&nbsp;&nbsp; root -> data = s2[length-1];//根结点的值
&nbsp;&nbsp;&nbsp; for(i = 0; i < length; i++)//在中序序列中找等于根节点的位置i
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(s1[i] == root -> data)//如果中序排列中的元素与后序排列中最后一个元素相同,跳出循环;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;//这个相同元素则为根节点
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; root -> lchild = creat(i, s1, s2);//递归构造左子树 左子树节点个数,左中序,左后序
&nbsp;&nbsp;&nbsp; root -> rchild = creat(length - i - 1, s1 + i + 1, s2 + i);//递归构造右子树 右子树节点个数,右中序,右后序
&nbsp;&nbsp;&nbsp; return root;
}
void xianxv(struct node *root)
{
&nbsp;&nbsp;&nbsp; if(root)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%c", root -> data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xianxv(root -> lchild);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xianxv(root -> rchild);
&nbsp;&nbsp;&nbsp; }
}//先序遍历
int main()
{
&nbsp;int length,m;
&nbsp;int count=0;//定义一个计数器
&nbsp;system("color 3F");//设置界面背景颜色
&nbsp;printf("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 求先序序列&nbsp;&nbsp;&nbsp; 1604031045&nbsp;&nbsp; 朱涛&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \n\n");
&nbsp;printf("请输入中序序列:");
&nbsp;scanf("%s",&s1);
&nbsp;printf("\n");
&nbsp;length = strlen(s1);//读取输入的字符串的长度
&nbsp;if(length>8)//控制输入的字符长度
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("输出字符超出字数限制,错误!!");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0; //终止程序
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; for(m=0;m<length;m++)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;if(s1[m]<'A'||s1[m]>'Z')
&nbsp;&nbsp;&nbsp; &nbsp;{
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;printf("第%d个字符输入存在非法字符,请输入大写字母\n",m+1);
&nbsp;&nbsp;&nbsp;count++;//当检测到非法字符,计数器就自增
&nbsp;&nbsp;}
&nbsp;}
&nbsp;if(count>0)
&nbsp;return 0;
&nbsp;&nbsp;&nbsp; printf("请输入后序序列:");
&nbsp;&nbsp;&nbsp; scanf("%s",&s2);
&nbsp;&nbsp;&nbsp; printf("\n");
&nbsp;&nbsp;&nbsp; for(m=0;m<length;m++)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;if(s2[m]<'A'||s2[m]>'Z')
&nbsp;&nbsp;&nbsp; &nbsp;{
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;printf("第%d个字符输入存在非法字符,请输入大写字母\n",m+1);
&nbsp;&nbsp;&nbsp;count++;
&nbsp;&nbsp;}
&nbsp;}
&nbsp;if(count>0)
&nbsp;{
&nbsp;return 0;
&nbsp;}
&nbsp;&nbsp;&nbsp; printf("先序序列为:");
&nbsp;&nbsp;&nbsp; struct node *root;//定义一个root指针
&nbsp;&nbsp;&nbsp; root = creat(length, s1, s2);//递归构造二叉树
&nbsp;&nbsp;&nbsp; xianxv(root);
&nbsp;&nbsp;&nbsp; printf("\n");
&nbsp;&nbsp;&nbsp; return 0;
}
当数据输入无法构造二叉树,怎么让它提示报错,求大神指点

[此贴子已经被作者于2018-3-7 21:51编辑过]

附件: 您没有浏览附件的权限,请 登录注册
2018-03-07 21:06







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031857 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved