トピック:
繰り返される要素のない整数配列numsが与えられます。この配列から直接再帰的に構築される最大二分木は、次のように定義されます。
二分木のルートは、配列numsの最大の要素です。
左側のサブツリーは、配列の最大値の左側の部分から再帰的に構築された最大の二分木です。
右側のサブツリーは、配列の最大値の右側の部分から再帰的に構築された最大の二分木です。
例:
解決
ルートノードが最初に構築されるため、バイナリツリーを構築するために一般的に使用されるプレオーダー
一般的に言えば、空のノード(nullポインター)が再帰に入ることが許可されている場合、ifは追加されません。空のノードが再帰に入ることが許可されていない場合、if制限が追加され、それに応じて終了条件が調整されます。
コード
class Solution {
public:
TreeNode* traversal(vector<int>& nums, int left, int right) {
if (left >= right) return nullptr;
//分割,找到局部最大值
int delimitIndex = left;
for (int i = left + 1; i < right; i++) {
if (nums[i] > nums[delimitIndex]) {
delimitIndex = i;
}
}
//创建节点,
TreeNode* node = new TreeNode(nums[delimitIndex]);
//左右节点返回值递归
node->left = traversal(nums, left, delimitIndex);
node->right = traversal(nums, delimitIndex + 1, right);
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
};