Solución del problema de Leetcode 108: convierta una matriz ordenada en un árbol de ordenación binario

Descripción del problema

Darle una matriz de números enteros, donde los elementos se han organizado en orden ascendente, conviértalo en un árbol de búsqueda binario altamente equilibrado.

Un árbol binario de altura equilibrada es un árbol binario que satisface "el valor absoluto de la diferencia de altura entre los subárboles izquierdo y derecho de cada nodo no excede 1".

Ejemplo 1:
Inserte la descripción de la imagen aquí

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

Inserte la descripción de la imagen aquí
Ejemplo 2:
Inserte la descripción de la imagen aquí

输入:nums = [1,3]
输出:[3,1]
解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。

Ideas de resolución de problemas:

El recorrido en orden de BST está en orden ascendente, por lo que esta pregunta es equivalente a recuperar el árbol de búsqueda binaria en función de la secuencia del recorrido en orden. Por lo tanto, podemos tomar cualquier elemento en la secuencia ascendente como nodo raíz, construir el subárbol izquierdo con la secuencia ascendente a la izquierda del elemento y construir el subárbol derecho con la secuencia ascendente a la derecha del elemento, de modo que el El árbol obtenido es un árbol de búsqueda binario, y debido a que esta pregunta requiere equilibrio, podemos seleccionar el elemento del medio cada vez como nuestro nodo raíz. De esta forma, la diferencia de altura entre los subárboles izquierdo y derecho es menor o igual a 1, y este proceso se realiza de forma recursiva, y finalmente se puede obtener un árbol de ordenamiento binario altamente equilibrado.
Nota: De hecho, aquí también se utiliza la idea de un árbol de decisión de media búsqueda, que compara la clave que se va a buscar con el valor del elemento del medio cada vez. Si es menor, busque a la izquierda del elemento del medio; de lo contrario, busque a la derecha. De esta manera, el proceso de búsqueda binaria puede ser descrito por un árbol binario, que es un árbol de ordenamiento binario altamente equilibrado.
Inserte la descripción de la imagen aquí

Código de implementación

class Solution {
    
    
    public int [] arr;      //保存原有序数组,避免数组传参
    public TreeNode genBinaryTree(int low,int high){
    
    
        //如果low>high,就没有元素,直接返回空即可
        if(low>high){
    
    
            return null;
        }
        //如果low==high,待处理序列只有一个元素,这个结点将被作为叶子结点,返回即可
        if(low==high){
    
    
            TreeNode p=new TreeNode(arr[low]);
            p.left=null;
            p.right=null;
            return p;
        }
        //否则,找到中间元素,然后构造根节点,然后继续完善该结点的左右子树
        int mid=(low+high+1)/2;
        TreeNode p=new TreeNode(arr[mid]);
        p.left=genBinaryTree(low,mid-1);
        p.right=genBinaryTree(mid+1,high);
        return p;
    }
    public TreeNode sortedArrayToBST(int[] nums) {
    
    
        int len=nums.length;
        arr=new int[len];
        for(int i=0;i<len;i++){
    
    
            arr[i]=nums[i];
        }
        return genBinaryTree(0,len-1);
    }
}

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_39736597/article/details/113939053
Recomendado
Clasificación