这道题还是使用递归的方法框架,主要就是观察前序遍历与中序遍历的特征。通过画图可以比较容易想到解法。
中间调试的时候报错了很多次。。。debug的时候发现,for循环里面,l2其实是可以等于r2的,这样的时候只有一个结点,而不是null。
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return Tr(preorder,0,preorder.size() - 1,
inorder,0,inorder.size() - 1);
}
TreeNode* Tr(vector<int>& preorder,int l1,int r1,
vector<int>& inorder,int l2,int r2){
if(l1 > r1)
return NULL;
int index = 0;
TreeNode* root = new TreeNode(preorder[l1]);
for(int i = l2;i <= r2;i++){
if(inorder[i] == preorder[l1]){
index = i;
break;
}
}
root->left = Tr(preorder,l1 + 1,l1 + index - l2,
inorder,l2,index - 1);
root->right = Tr(preorder,l1 + index - l2 + 1,r1,
inorder,index + 1,r2);
return root;
}
};