重建二叉树(字符串操作实现)

字符串操作实现重建二叉树

题目一:《算法竞赛入门经典》中的二叉树重建,文中用了非常棒的字符串方法去处理二叉树的重建过程,因为当知道树的前序遍历时,就可以确定树根,而从中序遍历中寻找树根的位置,树根左边为左子树,右边为右子树

代码:

#include<stdio.h>
#include<string.h>
void Build(int n, char *Front, char *Mid, char *s){
	if (n <= 0)
		return;
	int p = strchr(Mid, Front[0]) - Mid;        //因为前序遍历最左端的端点为根,所以从中序遍历中找出节点,右边的为右子树节点,左端为左子树端点
	Build(p, Front + 1, Mid, s);           //同理递归处理左子树
	Build(n - p - 1, Front + p + 1, Mid + p + 1, s + p);//处理右子树
	s[n - 1] = Front[0];//将根节点添加到最后
}
int main(){
	char Front[30], Mid[30], s[30];
	while (scanf("%s%s", Front, Mid) == 2){
		int n = strlen(Front);
		Build(n, Front, Mid, s);
		s[n] = '\0';
		printf("%s\n", s);
	}
}

此代码同样是NYOJ中题目221的题解 点击打开链接


题目二:此题正好与一相反知道后序遍历,中序遍历求前序遍历

#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
void ReBuild(int len, char*back, char*mid, char*s){
	if (len <= 0)
		return;
	int p = strchr(mid, back[len - 1]) - mid;//从中序遍历中寻找树根
	ReBuild(p, back, mid, s + 1);			//递归寻找左子树
	ReBuild(len - p - 1, back + p, mid + p + 1, s + p + 1);//递归寻找右子树
	s[0] = back[len - 1];//每次递归都是将尾节点放到当前数组的首位
}
int main(){
	char back[30], mid[30];
	char temp[30];
	while (cin >> back >> mid){
		memset(temp, 0, sizeof(temp));
		int len = strlen(back);
		ReBuild(len, back, mid, temp);
		cout << temp << endl;
	}
	return 0;
}
此代码是NYOJ 756的题解 点击打开链接


字符串操作很多内容,值得钻研,特别是与分治递归等思想结合时

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值