654. El árbol binario más grande
Dificultad media 242
Dada una matriz de enteros sin elementos repetidos
nums
. Un árbol binario máximo construido directamente de forma recursiva a partir de esta matriz se define de la siguiente manera:
- La raíz del árbol binario es
nums
el elemento más grande de la matriz .- El subárbol izquierdo es el árbol binario más grande construido de forma recursiva a partir de la parte izquierda del valor máximo de la matriz .
- El subárbol de la derecha es el árbol binario más grande construido de forma recursiva a partir de la parte derecha del valor máximo de la matriz .
Devuelve
nums
el árbol binario más grande construido con la matriz dada .
Ejemplo 1:
Entrada: nums = [3,2,1,6,0,5] Salida: [6,3,5, nulo, 2,0, nulo, nulo, 1] Explicación: La llamada recursiva es la siguiente: - [3 , El valor máximo en 2,1,6,0,5] es 6, la parte izquierda es [3,2,1] y la parte derecha es [0,5]. -El valor máximo en [3,2,1] es 3, la parte izquierda es [] y la parte derecha es [2,1]. -Arreglo vacío, sin nodos secundarios. -El valor máximo en [2,1] es 2, la parte izquierda es [] y la parte derecha es [1]. -Arreglo vacío, sin nodos secundarios. -Sólo hay un elemento, por lo que el nodo hijo es un nodo con un valor de 1. -El valor máximo en [0,5] es 5, la parte izquierda es [0] y la parte derecha es []. -Sólo hay un elemento, por lo que el nodo hijo es un nodo con un valor de 0. -Arreglo vacío, sin nodos secundarios.Ejemplo 2:
Entrada: nums = [3,2,1] Salida: [3, nulo, 2, nulo, 1]
inmediato:
1 <= nums.length <= 1000
0 <= nums[i] <= 1000
nums
Todos los números enteros son diferentes entre sí.
Recursividad
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* node = new TreeNode(0);
if(nums.size() == 1){
node->val = nums[0];
return node;
}
int maxValue = 0;
int maxValueIndex = 0; //找最大值
for(int i = 0; i < nums.size(); i++){
if(nums[i] > maxValue){
maxValue = nums[i];
maxValueIndex = i;
}
}
node->val = maxValue;
if(maxValueIndex > 0){
vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);
node->left = constructMaximumBinaryTree(newVec);
}
if(maxValueIndex < (nums.size()-1)){
vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());
node->right = constructMaximumBinaryTree(newVec);
}
return node;
}
};