小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如: 给定的树 A:
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/sh…
思路
这道题看到大佬的题解发现代码量比较少,但是思路还是比较巧妙的,所以这边根据大佬的题解做下记录,
1.如果比较的时候根节点比较完了,比较左子节点和右子节点
2.如果B为空说明这边A可以把B覆盖了return true,否则值不相等或则A先为空都return false
3.递归isSubStructure
(A != null && B != null)
&& (recur(A, B)
|| isSubStructure(A.left, B)
|| isSubStructure(A.right, B))
-
首先A、B不能为空,虽然AB为空的时候进入recur方法会返回结果,但是这是||条件连接,如果返回false就会继续比较后面的A.left等这个时候就可能出现空指针异常
-
然后发现A与B不能匹配就让A.left和B或者A.right去匹配,只要有一种情况成功就返回true
-
而在recur方法中只要A、B不为空就需要一直比较下去
recur(A.left, B.left) && recur(A.right, B.right)
代码
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
}
public boolean recur(TreeNode A, TreeNode B) {
if (B == null) return true;
if (A == null) return false;
if (A.val != B.val) return false;
return recur(A.left, B.left) && recur(A.right, B.right);
}
}