4-14 还原二叉树 (15分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
看一下视频讲解,额,这一部分在视频的后半部分呢,耐心看。
数据结构-浙江大学
我也是第一次接触二叉树,第一次写编程题,看了视频,也参考了别人的代码,将就着写完了,有几个问题,不太明白。
- 存储前序和中序序列,这里用的是char类型的数组,我开始写的是string,但是发现setTree函数里28和30行,不太容易表示,所以修改了。
新写的
#include<bits/stdc++.h>
using namespace std;
typedef struct TNode {
char data;
struct TNode *left;
struct TNode *right;
}*Tree,Node;
Tree setTree(char a[],char b[],int len) {
Tree t;
if(len==0) return NULL;
t=new Node;//申请新的节点
t->data=a[0];//设置根节点
int i;
for(i=0; i<len; i++) {
if(b[i]==a[0])
break;
}
t->left=setTree(a+1,b,i);
t->right=setTree(a+1+i,b+i+1,len-i-1);
return t;
}
int getTree(Tree t) {
int l,r,h;
if(t==NULL) return 0;
l=getTree(t->left);
r=getTree(t->right);
h=l>r?l:r;
h++;
return h;
}
int main() {
int n;
cin>>n;
char a[n],b[n];
cin>>a>>b;
Tree t1,t2;
Tree bt=setTree(a,b,n);
cout<<getTree(bt)<<endl;
return 0;
}
AC
本渣渣排错之后,该对了。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
typedef struct TNode {
char data;
struct TNode *left;
struct TNode *Right;
}*Tree,Node;
Tree setTree(char a[],char b[],int len) {
Tree t;
if(len==0)
return NULL;
//t=(Node *)malloc(sizeof(Node));
t=new Node;
t->data=a[0];
//根节点
int i;
for(i=0; i<len; i++) {
if(b[i]==a[0])
break;
//计算左右子树各有多少元素
}
//左子树的递归
t->left=setTree(a+1,b,i);
//右子树的递归
t->Right=setTree(a+1+i,b+i+1,len-i-1);
return t;
}
int getTree(Tree t) {
int L,R,H;
if(t==NULL)
return 0;
L=getTree(t->left);
R=getTree(t->Right);
/*
这样正常运行,答案正确
if(L>R) {
L++;
return L;
}
else {
R++;
return R;
}
*/
/*
不知道为什么这个样子写答案就是错的
if(L>R)
return L++;
else
return R++;
*/
H=L>R?L:R;
H++;
return H;
}
int main() {
Tree t1,t2;
int N;
cin>>N;
char a[N],b[N];
cin>>a>>b;
Tree BT=setTree(a,b,N);
cout<<getTree(BT)<<endl;
return 0;
}