//中序遍历左子树在前序遍历中个数是相同的
//比如preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
//右子树有3个 也就是最后三个
void createTree(int start, int end, TreeNode*& head, vector<int>& preorder, vector<int>& inorder, int index) {
if (start > end)return;
int mid = -1;
head = new TreeNode(preorder[index]);
for (int i = start; i <= end; i++) {
if (inorder[i] == preorder[index]) {
mid = i;
break;
}
}
createTree(start, mid - 1, head->left, preorder, inorder, index + 1);
createTree(mid + 1, end, head->right, preorder, inorder, index + mid - start + 1);
}
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode* ans = NULL;
createTree(0, preorder.size() - 1, ans, preorder, inorder, 0);
return ans;
}
};
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
this->preorder = preorder;
for(int i = 0; i < inorder.size(); i++)
dic[inorder[i]] = i;
return recur(0, 0, inorder.size() - 1);
}
private:
vector<int> preorder;
unordered_map<int, int> dic;
TreeNode* recur(int root, int left, int right) {
if(left > right) return nullptr; // 递归终止
TreeNode* node = new TreeNode(preorder[root]); // 建立根节点
int i = dic[preorder[root]]; // 划分根节点、左子树、右子树
node->left = recur(root + 1, left, i - 1); // 开启左子树递归
node->right = recur(root + i - left + 1, i + 1, right); // 开启右子树递归
return node; // 回溯返回根节点
}
};
//作者:Krahets
//链接:https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/solutions/100091/mian-shi-ti-07-zhong-jian-er-cha-shu-di-gui-fa-qin/