复制代码
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty()||inorder.empty()) return nullptr;
vector<int> lpre,lin,rpre,rin;
TreeNode* ans=new TreeNode(preorder[0]);;
int flg=0;
// 分割中序:左子树和右子树(不含根节点)
for(int i=0;i<inorder.size();++i){
if(inorder[i]==preorder[0]){
flg=i;
break;
}
}
for(int i=0;i<flg;++i){
lin.push_back(inorder[i]);
}
for(int i=flg+1;i<inorder.size();++i){
rin.push_back(inorder[i]);
}
// 分割前序:根据左子树的大小
for(int i=1;i<=lin.size();++i){
lpre.push_back(preorder[i]);
}
for(int i = 1 + lin.size(); i < preorder.size(); ++i) {
rpre.push_back(preorder[i]);
}
ans->left=buildTree(lpre,lin);
ans->right=buildTree(rpre,rin);
return ans;
}
};
复制代码
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty()) return nullptr;
// 根节点是前序遍历的第一个元素
int rootVal = preorder[0];
TreeNode* root = new TreeNode(rootVal);
// 在中序遍历中找到根节点位置
int rootIndex = 0;
for (int i = 0; i < inorder.size(); ++i) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
// 分割中序遍历
vector<int> leftInorder(inorder.begin(), inorder.begin() + rootIndex);
vector<int> rightInorder(inorder.begin() + rootIndex + 1, inorder.end());
// 分割前序遍历
vector<int> leftPreorder(preorder.begin() + 1,
preorder.begin() + 1 + leftInorder.size());
vector<int> rightPreorder(preorder.begin() + 1 + leftInorder.size(),
preorder.end());
// 递归构建左右子树
root->left = buildTree(leftPreorder, leftInorder);
root->right = buildTree(rightPreorder, rightInorder);
return root;
}
};
复制代码
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return build(preorder, 0, preorder.size() - 1,
inorder, 0, inorder.size() - 1);
}
private:
TreeNode* build(vector<int>& preorder, int preStart, int preEnd,
vector<int>& inorder, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) return nullptr;
TreeNode* root = new TreeNode(preorder[preStart]);
// 在中序中找到根节点
int rootIndex = inStart;
while (inorder[rootIndex] != preorder[preStart]) rootIndex++;
int leftSize = rootIndex - inStart;
// 递归构建
root->left = build(preorder, preStart + 1, preStart + leftSize,
inorder, inStart, rootIndex - 1);
root->right = build(preorder, preStart + leftSize + 1, preEnd,
inorder, rootIndex + 1, inEnd);
return root;
}
};