Tabla de contenido
La espada apunta a la Oferta 26. La subestructura del árbol
Resultados de ejecución: Editar
Ingrese dos árboles binarios A y B y determine si B es una subestructura de A. (Se acepta que un árbol vacío no es una subestructura de ningún árbol)
B es una subestructura de A, es decir, la misma estructura y valores de nodo que B aparecen en A.
Por ejemplo:
dado el árbol A:
3
/ \
4 5
/ \
1 2
Dado el árbol B:
4
/
1
Devuelve verdadero porque B tiene la misma estructura y valores de nodo que un subárbol de A.Ejemplo 1:
Entrada: A = [1,2,3], B = [3,1] Salida: falsoEjemplo 2:
Entrada: A = [3,4,5,1,2], B = [4,1] Salida: verdaderolímite:
0 <= 节点个数 <= 10000
题解:
看注释,很详细
代码:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { // 空树直接返回false // A为空树说明A(左数、右数)遍历到最后也没发现和B根节点一样的节点 // B为空树说明B就是个空树:约定空树不是任意一个树的子结构 if(A==null||B==null) return false; // B为A的子结构有3种情况,满足任意一种即可: // 1.B的子结构起点为A的根节点,此时结果为recur(A,B) // 2.B的子结构起点隐藏在A的左子树中,而不是直接为A的根节点,此时结果为isSubStructure(A.left, B),即还没对比到和A的当前节点等于B的根节点,继续向下对比 // 3.B的子结构起点隐藏在A的右子树中,此时结果为isSubStructure(A.right, B),即还没对比到和A的当前节点等于B的根节点,继续向下对比 // 所以先调用fun函数判断当前A,B节点是否相等,不相同则A左边往下移继续和B对比,A左子树对比完都没有,则A右边往下移继续和B对比 return fun(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B); } // 判断当前A,B节点是否相等,递归则实现判断传进去的A,B是否为相同的树 public boolean fun(TreeNode A, TreeNode B){ if(B==null) return true; if(A==null||A.val!=B.val) return false; // 此处调用递归则说明,A和B已经相等,继续判断传进去的A,B是否为相同的树 return fun(A.left,B.left)&&fun(A.right,B.right); } }
运行结果: