5-1 还原二叉树 (25分)
来源:互联网 发布:移动硬盘监控软件 编辑:程序博客网 时间:2024/05/17 09:06
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9ABDFGHIECFDHGIBEAC
输出样例:
5
代码如下:同学们直接复制是不行了,记到解水印,但是你水印都不会解的话,那答案。。。。。。。。。。。。。。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
char data;
struct node *left,*right;
}*Tree;
//递归创建树
Tree createTree(char *pre,char *ino,int n){//传入先序变量,中序遍历,和有多少个元素
Tree root=NULL;//初始话双亲节点
int i=0;//定义一个初始化值为0的计数器
int pl=0,pr=0;//初始化先序的左孩子数和右孩子数
int il=0,ir=0;//初始化中序的左孩子数和右孩子数
char lpre[50],rpre[50];//定于先序左,右孩子的分别所占的总个数
char lino[50],rino[50];//定于先序左,右孩子的分别所占的总个数
if(n==0){
return NULL;//如果传入的总个数为0返回NULL
}
root=(Tree)malloc (sizeof(struct node));//申请存储空间
if(root==NULL){
return NULL;//返回为空
}
memset(root,0,sizeof(struct node));
root->data=pre[0];//先序的第一个是根节点
//将中序遍历分割为两个数组
for(i=0;i<n;i++){
if((i<=il)&&(ino[i]!=pre[0])){//得到左孩子的数
lino[il++]=ino[i];//左孩子装到左数组中
}else if(ino[i]!=pre[0]){
rino[ir++]=ino[i];//右孩子装到左数组中
}
}
//由于左右孩子的个数相同,所以可以得到分割后的先序数组
for(i=1;i<n;i++){
if(i<(il+1)){
lpre[pl++]=pre[i];//将左孩子装在一个数组中
}else{
rpre[pr++]=pre[i];//将右孩子装在一个数组中
}
}
root->left=createTree(lpre,lino,il);//创建左边孩子
root->right=createTree(rpre,rino,ir);//创建右孩子
return root;//返回根结点
}
//先序遍历,底层为递归算法
void preorder(Tree b){
if(b==NULL){
return ;
}else{
printf("%c",b->data);//输出对应的结果
preorder(b->left);//向左递归查找
preorder(b->right);//向右递归查找
}
}
//计算树的高度是多少
int highTree(Tree b){
int left=0,max=0,right=0;//初始化左,最大值,右指数为0
if(b){
left=highTree(b->left);//递归调用该方法
right=highTree(b->right);//递归调用该方法
max=(left>right)?left:right;//比较两个的大小
return (max+1);//返回最大值
}else{
return 0;//失败返回0
}
}
int main(){
char preNode[50];
char inNode[50];
int n = 0; //用来统计数
int count=0;
char ch;
scanf("%d",&count);
Tree root=NULL;
getchar();//吃空格
while((ch = getchar())&&ch!='\n')
preNode[n++] = ch;
n = 0; //初始化,为下一次计数做准备
while((ch = getchar())&&ch!='\n')
inNode[n++] = ch;
root = createTree(preNode,inNode,n);
// preorder(root); //打印输出
int max=0;
max=highTree(root);//得到树的高度
printf("%d",max);//打印树的高度
return 0;
}
- 5-1 还原二叉树 (25分)
- 5-23 还原二叉树 (25分)
- 5-23 还原二叉树 (25分)
- 5-23 还原二叉树 (25分)
- 还原二叉树(25 分)
- 还原二叉树 (8分)
- 前序中序确认二叉树 7-23 还原二叉树(25 分)
- 5-23 还原二叉树
- 5-23 还原二叉树
- 04-1 还原二叉树
- 还原二叉树
- 二叉树还原
- 还原二叉树
- 二叉树的还原
- pta 还原二叉树
- 还原二叉树
- 还原二叉树
- 还原二叉树
- Eclipse中<Jquery.min.js>报错解决方法
- 算法导论 2.2-2
- 2017 山东acm省赛
- Python读取PDF文件
- Windows API 空壳应用程序
- 5-1 还原二叉树 (25分)
- 操作系统实验五之线程生成Fibonacci数列
- 5-2 根据后序和中序遍历输出先序遍历 (25分)
- Java编程思想-13字符串
- 5-3 树的遍历 (25分)
- SSM搭建总结
- 微信小程序循环赋值坑
- 使用脚本拷贝官方的 Material Design 图标到自己的 Android App 项目
- Springboot @RequestBody + Retrofit @Body 之实体类字段含有日期Date类型的提交方式