字符串操作实现重建二叉树
题目一:《算法竞赛入门经典》中的二叉树重建,文中用了非常棒的字符串方法去处理二叉树的重建过程,因为当知道树的前序遍历时,就可以确定树根,而从中序遍历中寻找树根的位置,树根左边为左子树,右边为右子树
代码:
#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的题解
点击打开链接
字符串操作很多内容,值得钻研,特别是与分治递归等思想结合时