Sword se refiere a la Oferta 26. La subestructura del árbol --- recursividad

tema

Ingrese dos árboles binarios A y B para determinar si B es una subestructura de A. (Se acuerda que el árbol vacío no es una subestructura de ningún árbol)

B es una subestructura de A, es decir, A tiene la misma estructura y valor de nodo que B.

Por ejemplo:
dado el árbol A:
Inserte la descripción de la imagen aquí

Dado el árbol B:
Inserte la descripción de la imagen aquí

Devuelve verdadero porque un subárbol de B y A tiene la misma estructura y valores de nodo.

Ejemplo 1:

Entrada: A = [1,2,3], B = [3,1]
Salida: falso
Ejemplo 2:

Entrada: A = [3,4,5,1,2], B = [4,1]
Salida: verdadera

Fuente:
Enlace de LeetCode : Haga clic para ir a https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof

Ideas:

1. Escriba la función isKid, recursivamente recursiva cada nodo del árbol en el preorder, determine si es un subárbol, llame a la función isSame ()
(1) Salida recursiva: devuelva falso cuando el nodo está vacío;
(2) Si el nodo B es el mismo que esta vez El subárbol de A es el mismo. La función isSame () devuelve verdadero
(3) Atraviesa el árbol de la izquierda
(4) Atraviesa el árbol de la derecha
(5) y finalmente regresa siempre que isSame sea verdadero

2. Escriba la función isSame
(1) Salida recursiva: devuelve verdadero si B está vacío
(2) A == vacío o el valor de A no es igual al valor de B: devuelve falso
(3) Atraviesa el árbol de la izquierda
(4 ) Atraviesa el árbol de la derecha

3. La función principal puede llamar a la función isKid
(nota: B está vacío es una condición especial, debe juzgar)

Código

class Solution{
    
    

    public boolean isSubStructure(TreeNode A, TreeNode B) {
    
    
        if(B == null) return false;
        if(isKid(A,B)) return true;
        return false;
    }
    public boolean isKid(TreeNode A, TreeNode B) {
    
    
        if(A == null) return false;
        boolean s = isSame(A,B);
        boolean l = isKid(A.left,B);
        boolean r = isKid(A.right,B);
        return s || l || r;
    }
    public boolean isSame(TreeNode A,TreeNode B) {
    
    
        if(B == null) return true;
        if(A == null || A.val != B.val) {
    
    
            return false;
        }
        boolean l = isSame(A.left,B.left);
        boolean r = isSame(A.right,B.right);
        return l && r;
    }

}

Función de prueba


    public TreeNode createA() {
    
    
        TreeNode headA = new TreeNode(1);
        TreeNode cur4 = new TreeNode(0);
        TreeNode cur5 = new TreeNode(1);
        TreeNode cur1 = new TreeNode(-4);
        TreeNode cur2 = new TreeNode(-3);
        headA.left = cur4;
        headA.right = cur5;
        cur4.left = cur1;
        cur4.right = cur2;
        return headA;
    }
    public TreeNode createB() {
    
    
        TreeNode headB = new TreeNode(1);
        TreeNode cur1 = new TreeNode(-4);
        headB.left = cur1;
        return headB;
    }

    public static void main(String[] args) {
    
    
        Solution a = new Solution();
        TreeNode A = a.createA();
        TreeNode B = a.createB();
        System.out.println(a.isSubStructure(A, B));
    }

Supongo que te gusta

Origin blog.csdn.net/starry1441/article/details/115140131
Recomendado
Clasificación