#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
};
TreeNode* ConstructCore(vector<int>& preorder, int preorderLeft, int preorderRight, vector<int>& inorder, int inorderLeft, int inorderRight) {
int headVal = preorder[preorderLeft];
TreeNode* root = new TreeNode;
root->val = headVal;
root->left = nullptr;
root->right = nullptr;
if (preorderLeft == preorderRight)
return root;
vector<int>::iterator iter = inorder.begin() + inorderLeft;
while (iter != inorder.end() && *iter != headVal) {
iter++;
}
int len = iter - inorder.begin() - inorderLeft;
if(len>0)
root->left = ConstructCore(preorder, preorderLeft+1, preorderLeft+len, inorder, inorderLeft, inorderLeft+len-1);
if(len< inorderRight-inorderLeft)
root->right = ConstructCore(preorder, preorderLeft+len+1, preorderRight, inorder, inorderLeft+len+1, inorderRight);
return root;
}
void dpsPrint(TreeNode* root) {
queue<TreeNode*> que;
que.push(root);
while (!que.empty()) {
TreeNode* temp = que.front();
que.pop();
if (temp->left)
que.push(temp->left);
if (temp->right)
que.push(temp->right);
cout << temp->val << " ";
}
}
int main() {
vector<int> preorder = { 1,2,4,7,3,5,6,8 };
vector<int> inorder{ 4,7,2,1,5,3,8,6 };
TreeNode* root=ConstructCore(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
dpsPrint(root);
return 0;
}