剑指offer打卡day17——AcWing 37. 树的子结构
发布日期:2021-05-08 21:31:38 浏览次数:23 分类:精选文章

本文共 1159 字,大约阅读时间需要 3 分钟。

【题目描述】

题目是判断一个二叉树A是否包含另一个二叉树B作为其子树。

【思路】

为了判断树B是否是树A的子树,我们可以采用以下方法:

  • 遍历树A中的每一个节点,假设该节点为根节点,分别将树B与此根节点对齐进行比较。
  • 同时遍历树B和当前对齐的树A的子树,逐层检查节点值和子节点是否一致。如果在某一层发现不一致,则说明当前对齐情况不满足子树关系,继续下一个节点的尝试。
  • 代码实现如下:

    public class TreeNode {      int val;      TreeNode left;      TreeNode right;      TreeNode(int x) { val = x; }  }  public class Solution {      public boolean hasSubtree(TreeNode pRoot1, TreeNode pRoot2) {          // 如果任意一个树为空,直接返回false          if (pRoot1 == null || pRoot2 == null) {              return false;          }          // 判断当前节点及其子树是否与目标树一致          if (isSame(pRoot1, pRoot2)) {              return true;          }          // 递归检查左子树和右子树          return hasSubtree(pRoot1.left, pRoot2.left) || hasSubtree(pRoot1.right, pRoot2.right);      }      public boolean isSame(TreeNode root1, TreeNode root2) {          // 如果右子树为空,左子树也必须为空才能满足条件          if (root2 == null) {              return true;          }          // 检查当前节点值和子树结构是否一致          if (root1 == null || root1.val != root2.val) {              return false;          }          // 递归检查左子树和右子树是否一致          return isSame(root1.left, root2.left) && isSame(root1.right, root2.right);      }  }
    上一篇:《网络协议从入门到底层原理》基础知识(八)——代理服务器、CDN、常见攻击
    下一篇:专题(七)贪心——AcWing 112. 雷达设备

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年03月21日 04时44分33秒