4-14 还原二叉树 (15分)

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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆烂.MVP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值