【树】——剑指Offer26树的子结构

252 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如: 给定的树 A:

image.png

来源:力扣(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);
    }
}