思路:
这道题的话,我们只需要知道二叉树的遍历特点即可,前序数组的第一个数字就是我们要建立的第一个根节点的值,那么我们就需要在中序数组上遍历得到左右子树的划分,我们知道中序是LDR,所以在根节点x的左边一定是左子树,周而复始递归即可。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
//当然,这道题也可以换成 判断能否构成二叉树
TreeNode* dfs(vector<int>& t1,int left1,int right1,vector<int>& t2,int left2,int right2){
if(left1>right1) return NULL;
int rt = t1[left1];
TreeNode* root = new TreeNode(rt);
if(right1==left1) return root;
int i=0;
for( i=left2;i<=right2;++i){
}
root->left = dfs(t1,left1+1,left1+(i-left2),t2,left2,i-1);
root->right = dfs(t1,left1+(i-left2)+1,right1,t2,i+1,right2);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size()==0 || inorder.size()==0) return NULL;
//这里我们要left,right来表示下标,好操作
return dfs(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
}
};