Sword se refiere a la oferta 33. Secuencia transversal posterior al pedido del árbol de búsqueda binaria

Sword se refiere a la oferta 33. Secuencia transversal posterior al pedido del árbol de búsqueda binaria

Descripción del Título

Inserte la descripción de la imagen aquí

Ideas para resolver problemas

Si solo se conoce la secuencia transversal posterior al orden del árbol binario ordinario, no se puede restaurar el árbol binario original, porque no se puede determinar el rango de subíndices de los subárboles izquierdo y derecho.

Pero esta pregunta es un árbol de búsqueda binario, que puede determinar el rango de subíndices de los subárboles izquierdo y derecho en función de propiedades especiales.

Además, si endOfLefty indexal descender, debemos prestar atención a los problemas transfronterizos del subíndice , y el margen izquierdo aquí no es 0, sino que comienza.

class Solution {
    
    
    public boolean verifyPostorder(int[] postorder) {
    
    
        if (postorder.length == 0) return true;
        return verifyPostorder(postorder, 0, postorder.length - 1);
    }

    //判断 postorder[begin...end] 是否是二叉搜索树的后序遍历结果
    public boolean verifyPostorder(int[] postorder, int begin, int end) {
    
    
        // base case
        if (begin >= end) return true;

        int endOfLeft = end;   //左子树的结束索引
        //左子树结束索引对应的元素是第一个比 postorder[end] 小的元素
        while (endOfLeft >= begin && postorder[endOfLeft] >= postorder[end]) endOfLeft--;
        //由于上面 while 遍历时,已经确保了右子树的所有元素都大于 postorder[end],所以要继续判断左子树的正确性
        int index = endOfLeft;
        while (index >= begin && postorder[index] < postorder[end]) index--;
        //首先要保证左子树的正确性,然后继续遍历左子树和右子树
        return (index + 1 == begin) && verifyPostorder(postorder, begin, endOfLeft) 
                && verifyPostorder(postorder, endOfLeft + 1, end - 1);
    }
}

Supongo que te gusta

Origin blog.csdn.net/cys975900334/article/details/115175564
Recomendado
Clasificación