Leetcode問題の解決策-654。最大の二分木

トピックリンク

タイトル説明:

繰り返される要素のない整数配列が与えられます。この配列から構築される最大二分木は、次のように定義されます。

二分木のルートは、配列内の最大の要素です。
左側のサブツリーは、配列の最大値の左側から構築された最大の二分木です。
右側のサブツリーは、配列の最大値の右側の部分から構築された最大の二分木です。
指定された配列から最大のバイナリツリーを構築し、このツリーのルートノードを出力します。

例:

入力:[3,2,1,6,0,5]出力:次のツリーのルートノードを返します。


問題解決のアイデア

  トピックの要件を読んだ後、分割統治の強い考えを嗅ぎました。最大インデックスで左右のサブツリー間隔を区別し、最後まで分割統治します。実際、それほど高くはありません。 。実際には、事前注文トラバーサルフレームワークを適用して、ツリーを再帰的に構築し、分割統治します。考えは再帰に任されています。主に現在のノードの操作に焦点を当てます。つまり、[left...right]中央のnumsの最大値を見つけnew、1つのステップでノードを作成します。


コード

class Solution {
    
    
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
    
    
        if(nums.size() == 0)
            return NULL;

        return helper(nums, 0, nums.size() - 1);
    }

private:
    TreeNode* helper(vector<int>& nums, int left, int right){
    
    
        if(left > right)
            return NULL;
        
        int index = getMaxIndex(nums, left, right);
        TreeNode* root = new TreeNode(nums[index]);

        root->left = helper(nums, left, index - 1);
        root->right = helper(nums, index + 1, right);
        return root;
    }

    int getMaxIndex(vector<int>& nums, int left, int right){
    
    
        int result = -1, index = -1;
        for(int i = left; i <= right; i++){
    
    
            if(nums[i] > result){
    
    
                result = nums[i];
                index = i;
            }
        }
        return index;
    }
};

間違いや厳しくない場合は訂正してください、ありがとうございます。
私のブログ:http//breadhunter.gitee.io

おすすめ

転載: blog.csdn.net/weixin_40807714/article/details/105183477