4-14 还原二叉树 (15分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
代码
#include<iostream>
#include<algorithm>
#include<string>
#include<bits/stdc++.h>
using namespace std;
char pre[10001],in[10001];
struct Binode{
char data;
struct Binode *left,*right;
};
typedef struct Binode *Bitree;
void prein(int i,int j,int m,int k,Bitree *root);
void preinCreat(int n,Bitree *root){
if(n<=0) return ;
else prein(0,n-1,0,n-1,root);
}
void prein(int i,int j,int m,int k,Bitree *root){
*root=(struct Binode*)malloc(sizeof(struct Binode));
(*root)->data=pre[i];
int p=m;
while(in[p]!=pre[i]) p++;
if(p==m) (*root)->left==NULL;
else prein(i+1,i+p-m,m,p-1,&((*root)->left));
if(p==k) (*root)->right==NULL;
else prein(i+p-m+1,j,p+1,k,&((*root)->right));
}
int getH(Bitree bt){
int r,l,h;
if(bt){
r=getH(bt->right);
l=getH(bt->left);
h=r>l?r:l;
return h+1;
}else return 0;
}
int main(){
int N;
cin>>N;
scanf("%s%s",pre,in);
Bitree tree;
preinCreat(N,&tree);
printf("%d",getH(tree));
}
4-15 根据后序和中序遍历输出先序遍历 (15分)
本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30),是树中结点的个数。随后两行,每行给出N个整数,分别对应后序遍历和中序遍历结果,数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder:以及该树的先序遍历结果。数字间有1个空格,行末不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
Preorder: 4 1 3 2 6 5 7
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
int post[10001],in[10001];
typedef struct Node{
int Data;
struct Node *left,*right;
}tNode,*Tree;
void poinCreat(int i,int j,int m,int n,Tree *root);
void Creat(int n,Tree *root){
if(n<=0) return ;
else poinCreat(0,n-1,0,n-1,root);
}
void poinCreat(int i,int j,int m,int n,Tree *root){
*root=(tNode*)malloc(sizeof(tNode));
(*root)->Data=post[j];
int k=m;
while(post[j]!=in[k]) k++;
if(k==m) (*root)->left=NULL;
else poinCreat(i,i+k-m-1,m,k-1,&(*root)->left);
if(k==n) (*root)->right=NULL;
else poinCreat(i+k-m,j-1,k+1,n,&(*root)->right);
}
void preprint(Tree root){
if(root){
printf(" %d",root->Data);
preprint(root->left);
preprint(root->right);
}
else return ;
}
int main(){
Tree tr;int N;
cin>>N;
for(int i=0;i<N;i++){
cin>>post[i];
}
for(int i=0;i<N;i++){
cin>>in[i];
}
Creat(N ,&tr);
printf("Preorder:");
preprint(tr);
}