思路:
这道题的思路是很明确的,我们都知道前序的第一个节点就是当前的根节点,然后用这个根节点x在中序数组上进行分割,因为在中序数组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:
typedef vector<int>::iterator Iterator;
TreeNode* dfs(Iterator it1,int len1,Iterator it2,int len2){
int now = (*it1);
TreeNode* root = new TreeNode(now);
if(len1==1) return root;
Iterator bk = it2;
int i=1;
while(i<=len2){
if((*bk)==now) break;
++i;
++bk;
}
if(i-1>=1) root->left = dfs(it1+1,i-1,it2,i-1);
if(len2-i>=1) root->right = dfs(it1+i,len2-i,++bk,len2-i);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() == 0 || inorder.size()==0) return 0;
return dfs(preorder.begin(),preorder.size(),inorder.begin(),inorder.size());
}
};