トピックリンク
タイトル説明:
繰り返される要素のない整数配列が与えられます。この配列から構築される最大二分木は、次のように定義されます。
二分木のルートは、配列内の最大の要素です。
左側のサブツリーは、配列の最大値の左側から構築された最大の二分木です。
右側のサブツリーは、配列の最大値の右側の部分から構築された最大の二分木です。
指定された配列から最大のバイナリツリーを構築し、このツリーのルートノードを出力します。
例:
問題解決のアイデア
トピックの要件を読んだ後、分割統治の強い考えを嗅ぎました。最大インデックスで左右のサブツリー間隔を区別し、最後まで分割統治します。実際、それほど高くはありません。 。実際には、事前注文トラバーサルフレームワークを適用して、ツリーを再帰的に構築し、分割統治します。考えは再帰に任されています。主に現在のノードの操作に焦点を当てます。つまり、[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