offer26

tech2026-10-09  1

思路:

先序遍历A的每个节点N:isSubStructure(A,B)判断以N为根节点的子树是否包含树B:recur(A,B)对于函数isSubStructure(A,B)

当A为空或者B为空时,返回false

当B为A的子树时,瞒住以下条件中的一个

以节点A为根节点的子树包含树B,对应recur(A,B)以A节点的左孩子为根节点的子树包含树B:对应isSubStructure(A.left,B)以A节点的右孩子为根节点的子树包含树B,对应isSubStructure(A.right,B)

对于函数recur(A,B)

终止条件:

当节点B为空,则证明匹配完毕,返回true

当节点A为空,说明已经越过A的叶子节点,无法匹配,返回false

当节点A和节点B的值不同,说明匹配失败,法兰会false

返回值:

判断A和B的左节点是否相等recur(A.left,B.left)

判断A和B的右节点是否相等recur(A.right,B.right)

/** * 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) { if(A==null || B==null) return false; return recur(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B); //当前根节点为A,因此需要再次调用isSubStructure,改变当前根节点,不能直接调用recur } public boolean recur(TreeNode A,TreeNode B){ if(B==null) return true; if(A==null || A.val != B.val) return false; return recur(A.left,B.left) && recur(A.right,B.right); } }

 

最新回复(0)