アイデア:
この質問では、バイナリツリーのトラバーサル特性を知るだけで済みます。プレオーダー配列の最初の数は、確立する最初のルートノードの値であり、次にインオーダーでトラバースする必要があります。取得する配列左と右のサブツリーの分割では、中間次数が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);
}
};