剑指 Offer 26. 树的子结构

1. 题目

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

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

例如:
给定的树 A:

     3
    / \
   4   5
  / \
 1   2

给定树B:

   4 
  /
 1

 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

2. 示例

示例1

输入:A = [1,2,3], B = [3,1]
输出:false

示例2

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

 3. 题解

开始尝试了很多种方式,发现最初递归的方式始终不能回传。

最终的递归方式:

  • 主要思想:将所有节点作为根节点,然后将B与A对比,B与A的左节点对比,B与A的右节点对比。
  • 当找到相等的,那么就只需要对比B的左与A的左,B的右与A的右。

4. 实现

public class IsSubStructure26 {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        // 其中一个为null,直接返回false
        if(A == null || B == null) return false;
        // 将A的所有节点作为根节点
        return middleScanner(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
    }

    private boolean middleScanner (TreeNode root, TreeNode cur) {
        // B为null,说明所有的B在A中都能找到,返回true,结束。
        if(cur == null) return true;
        // 当A为null,B不为null,说明cur未能匹配完,返回false。
        if(root == null) return false;
        // A、B相等,继续比较它们的左右子节点。
        if(root.val == cur.val) {
            return middleScanner(root.left, cur.left) && middleScanner(root.right, cur.right);
        } else {
            // 不等,结束当前循环
            return false;
        }
    }
}

5. 结语

  努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

  如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-07-06 11:15  抚琴尘世客  阅读(55)  评论(0编辑  收藏  举报