思路:
参数:前序序列,中序序列,和两个序列的范围,表示这个树所有结点
根据前序,可以知道开始位置就是根结点,然后再中序里面寻找根结点的位置,记住位置root_pos,
根结点左边的都是左子树结点,左子树结点个数left_Num=root_pos - in_start;
TreeNode *root= new TreeNode(pre[p_start])
递归建立左子树 前序序列的左子树范围就是pre_start+1~pre_start+1+leftNum
中序序列的左子树范围就是in_start~root_pos
递归建立右子树,前序序列的右子树范围就是pre_start+1+leftNum~pre_end
中序序列的右子树范围就是root_pos+1~in_end
在中序序列中查找根结点时,避免遍历,可以使用哈希表
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
unordered_map<int, int> map;
for (int i = 0; i < inorder.size(); i++)
{
map.insert(make_pair(inorder[i],i));
}
return build(preorder, 0, preorder.size(), inorder, 0, inorder.size(),map);
}
//pre_start前序的开始,p_end结束,包括左,不包括右
TreeNode* build(vector<int>& pre, int p_start, int p_end,
vector<int>& in, int i_start, int i_end,unordered_map<int, int> &map)
{
if (p_start == p_end){
return NULL;
}
int root_val = pre[p_start];
TreeNode *root = new TreeNode(root_val);
//利用哈希表在中序中,寻找root_val的值
int root_pos = map[root_val];
//左子树的个数
int left_Num = root_pos - i_start;
root->left = build(pre, p_start + 1, p_start + left_Num + 1, in, i_start, root_pos,map);
root->right = build(pre, p_start + left_Num + 1, p_end, in, root_pos+1, i_end, map);
return root;
}
};