先序+中序还原二叉树
题目描述
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出
输出为一个整数,即该二叉树的高度。
样例输入
9
ABDFGHIEC
FDHGIBEAC
样例输出
5
#include <bits/stdc++.h>
using namespace std;
int getdeep(string s1, string s2) {
if (s1[0] == s2[0])
return 1;
int root = s2.find(s1[0]);
string left1 = s1.substr(1, root);
string left2 = s2.substr(0, root);
string right1 = s1.substr(root + 1, s1.length() );
string right2 = s2.substr(root + 1, s2.length() );
return max(getdeep(left1, left2), getdeep(right1, right2)) + 1;
}
int main() {
int n;
cin >> n;
string s1, s2;
cin >> s1 >> s2;
cout << getdeep(s1, s2);
}
字数不够不能发布,水一下:
两串内在联系:先序遍历的第一节点为中序遍历的根节点,中序遍历根节点的坐标对应先序遍历左子树最末位。
流程:在中序字符串中找到根的坐标,以此为界把把原树分为两个子树,再对子树重复该操作。
对于该样例:
ABDFGHIEC 记为s1
FDHGIBEAC 记为s2
在s2中找到s1[0]后,
把s2分为 FDHGIBE 和 C 两个子树
把s1分为 BDFGHIE 和 C 两个子树
左子树对应左子树,右子树对应右子树
于是对FDHGIBE 和 BDEGHIE, C 和 C 分别重复以上操作
每操作一次高度加一