根据前序和中序构造二叉树,并使用map优化中序中找根的时间。
#include <iostream>
#include <map>
using namespace std;
//树的节点
using Node = struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(char x, TreeNode* left, TreeNode* right) : val(x), left(left),
right(right) {}
};
map<char, int> ma;
string preOrder, inOrder;
//前序指针,中序指针,子树个数
Node* builderTree(int i, int j, int n) {
if (n <= 0) return nullptr;
Node* root = new Node(preOrder[i]);
int index = ma[preOrder[i]] - j;
root->left = builderTree(i + 1, j, index);
root->right = builderTree(i + index + 1, j + index + 1, n - index - 1);
return root;
}
void afterOrder(Node *root){
if(root==nullptr) return;
afterOrder(root->left);
afterOrder(root->right);
cout<<root->val;
}
int main() {
while (cin >> preOrder >> inOrder) { // 注意 while 处理多个 case
for (int i = 0; i < inOrder.size(); i++)
ma[inOrder[i]] = i;
Node *root=builderTree(0, 0, inOrder.size());
afterOrder(root);
cout<<endl;
}
}

京公网安备 11010502036488号