题目:
解答:
递归求解,先序递归,递归时,先序遍历的序列一定是按先后顺序访问。
首先建立根节点,然后将中序序列分成两组,分别建立左右子树。
代码:
class Solution {
public:
TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
int pos = 0;
TreeNode *root = search(preorder, pos, inorder, 0, inorder.size() - 1);
return root;
}
private:
TreeNode *search(vector<int> &preorder, int &pos, vector<int> &inorder, int begin, int end)
{
if (begin > end)
return NULL;
TreeNode *root = new TreeNode(preorder[pos]);
int mid = find(preorder[pos], inorder, begin, end);
//先序表后移一位
++pos;
//递归建立左右子树
root->left = search(preorder, pos, inorder, begin, mid - 1);
root->right = search(preorder, pos, inorder, mid + 1, end);
return root;
}
//寻找根节点在中序表中的位置,以此将中序表分成两组
int find(int target, vector<int> &inorder, int begin, int end)
{
for (int i = begin; i <= end; i++)
{
if (target == inorder[i])
return i;
}
}
};