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:
Dado el árbol B:
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));
}