1.题目
2.解题思路
用递归的思想解决问题:
首先,前序遍历是“根左右”,而中序遍历是“左根右”, 所以由前序遍历能确定根节点,然后在中序遍历中找到该节点的位置,由该节点可划分左右子树,我们可以发现,数字1是根节点,并将二叉树分成了(247)和(3568)两棵子树。并且可以判断出左右字数的长度,由此构建左右子树;
假设,preStart为前序遍历的起始位置,int num = preorder[preStart]为根节点的值,所以就可以构建TreeNode* root = new TreeNode(num)的一个新的二叉树,再找出根节点在中序遍历中的位置,即index,int leftSize = index - inStart为左子树的长度,然后构建二叉树的左右子树,不断递归;
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{
return build(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}
TreeNode* build(vector<int>& preorder, vector<int>& inorder, int preStart , int preEnd, int inStart, int inEnd)
{
if(preStart > preEnd)
return nullptr;
int num = preorder[preStart];
TreeNode* root = new TreeNode(num);
int index = 0;
for(int i = inStart; i <= inEnd; i++)
{
if(inorder[i] == num)
{
index = i;
break;
}
}
int leftSize = index - inStart;
root->left = build(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1);
root->right = build(preorder, inorder, preStart + leftSize + 1, preEnd, index + 1, inEnd);
return root;
}
};