洛谷P1827 美国血统
url: https://www.luogu.com.cn/problem/P1827
tag:
递归, 二叉树
代码:
#include <iostream>
#include <string>
using namespace std;
string inorder, preorder;
void buildPostorder(int inStart, int inEnd, int preStart, int preEnd) {
// 若范围无效,则返回
if (inStart > inEnd || preStart > preEnd) {
return;
}
// 前序遍历的第一个元素即为根节点
char root = preorder[preStart];
// 在中序遍历中找到根节点的位置
int rootIndex = -1;
for (int i = inStart; i <= inEnd; ++i) {
if (inorder[i] == root) {
rootIndex = i;
break;
}
}
// 根节点左边的节点个数
int leftTreeSize = rootIndex - inStart;
// 递归处理左子树
buildPostorder(inStart, rootIndex - 1,
preStart + 1, preStart + leftTreeSize);
// 递归处理右子树
buildPostorder(rootIndex + 1, inEnd,
preStart + leftTreeSize + 1, preEnd);
// 最后输出根节点,实现后序遍历顺序:左子树 -> 右子树 -> 根
cout << root;
}
int main() {
// 输入中序遍历和前序遍历字符串
cin >> inorder >> preorder;
int n = inorder.size();
buildPostorder(0, n - 1, 0, n - 1);
return 0;
}