后序+中序序列构造二叉树
输入样例:
第一行输入序列长度n,第二行输入n个字符表示二叉树后序遍历的序列,第三行输入n个字符表示二叉树中序遍历的序列
9
GHDBEIFCA
GDHBAECIF
输出样例:
输出二叉树先序遍历的序列。
ABDGHCEFI
题解:
#include <iostream>
#include <string>
using namespace std;
// 二叉树结点结构定义
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
// 根据后序和中序序列构造二叉树
TreeNode* buildTree(string& inorder, string& postorder, int inStart, int inEnd, int postStart, int postEnd) {
if (inStart > inEnd)
return NULL;
// 后序序列的最后一个元素为根结点
TreeNode* root = new TreeNode(postorder[postEnd]);
// 在中序序列中找到根结点的位置
int rootIndex;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == postorder[postEnd]) {
rootIndex = i;
break;
}
}
// 根据根结点的位置,划分左右子树的范围
int leftSize = rootIndex - inStart;
int rightSize = inEnd - rootIndex;
// 递归构造左右子树
root->left = buildTree(inorder, postorder, inStart, rootIndex - 1, postStart, postStart + leftSize - 1);
root->right = buildTree(inorder, postorder, rootIndex + 1, inEnd, postEnd - rightSize, postEnd - 1);
return root;
}
// 先序遍历二叉树,输出结点值
void preorderTraversal(TreeNode* root) {
if (root == NULL)
return;
cout << root->val;
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main() {
int n;
cin >> n;
string postorder, inorder;
cin >> postorder >> inorder;
// 根据后序和中序序列构造二叉树
TreeNode* root = buildTree(inorder, postorder, 0, n - 1, 0, n - 1);
// 先序遍历并输出二叉树
preorderTraversal(root);
cout << endl;
return 0;
}