目次
2 つの二分木 A と B を入力し、B が A の部分構造であるかどうかを判断します。(空のツリーはどのツリーの下部構造でもないことに同意します)
BはAの部分構造、つまりBと同じ構造とノード値がAに現れます。
例:
与えられた木 A:
3
/ \
4 5
/ \
1 2
与えられた木 B:
4
/
1
B は A のサブツリーと同じ構造とノード値を持つため、true を返します。例 1:
入力: A = [1,2,3]、B = [3,1] 出力: false例 2:
入力: A = [3,4,5,1,2]、B = [4,1] 出力: true制限:
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); } }
运行结果: