剣はオファーを指します-------バイナリツリーを再構築します

ここに画像の説明を挿入

トピックリンク!

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

おすすめ

転載: blog.csdn.net/weixin_43743711/article/details/115065745