(输入两棵二叉树A和B,判断B是不是A的子结构。补充下,根据书中的代码来看,子结构的定义并不包括叶子节点下的null,也就是说只要B的存在数字的结构存在于A中就行,那么如果B是null树,那么就不属于A的子结构)

书中方法:书上的方法十分清晰,分为两个步骤,先在A树中找到B树的root.val,然后判断由该点向下是否完全包含B树的结构,直至遍历完A树。

	public boolean isChild(TreeNode aRoot, TreeNode bRoot){
//A树没有遍历完而且B树不为空
if(aRoot != null && bRoot != null){
//在当前节点检查结构,或者去遍历当前节点的左节点或右节点。
return isQualified(aRoot, bRoot)
|| isChild(aRoot.left, bRoot)
|| isChild(aRoot.right, bRoot);
}
//A树遍历完了或者B树是个null
return false;
} private boolean isQualified(TreeNode aRoot, TreeNode bRoot){
//检查到了B的末尾
if(bRoot == null)return true; //如果在检查完B之前A到了底
if(aRoot == null)return false; //都不是null且val相等,继续检查
if(aRoot.val == bRoot.val){
return isQualified(aRoot.left, bRoot.left)
&& isQualified(aRoot.right, bRoot.right);
} //都不是null但是val不等
return false; }

我的方法:开始检查一下B是否为空,空的话返回false(定义)。aRoot和bRoot是两个根节点,且都可能在自己的根节点和子节点之间转换。开头,如果aRoot.val和bRoot.val相等了,那么继续对各自的子节点进行对比;如果不相等则移动aRoot并和bRoot进行比较。

	public boolean isChildTree(TreeNode aRoot, TreeNode bRoot){
//定义,如果B树为空,返回false
if(bRoot == null){
return false;
}
return isChild2(aRoot, bRoot);
} private boolean isChild2(TreeNode aRoot, TreeNode bRoot){
//如果检查到了B的末尾
if(bRoot == null)return true; //A到了末尾但是B没有
if(aRoot == null)return false; //如果当前节点相同,进行进一步对比;
//对比的结果可能是false,此时继续向下检查aRoot.left与bRoot、aRoot.right与bRoot
if(aRoot.val == bRoot.val){
return (isChild2(aRoot.left, bRoot.left) && isChild2(aRoot.right, bRoot.right))
|| isChild2(aRoot.left, bRoot)
|| isChild2(aRoot.right, bRoot);
}else{//如果当前节点不同,继续向下检查aRoot.left与bRoot、aRoot.right与bRoot
return isChild2(aRoot.left, bRoot)
|| isChild2(aRoot.right, bRoot);
}
}

最新文章

  1. Morris.js和flot绘制折线图的比较
  2. PHP 文件包含总结 include require 命名空间 autoload spl_autoload_register 读取文件路径
  3. 《数据结构》 java的一维数组的内存结构与其特性
  4. 【Android】解析Json数据
  5. 用Jenkins配置自动化构建
  6. js 构造函数
  7. java微信开发(wechat4j)——wechat4j配置文件解读
  8. DOS下常用网络命令技巧
  9. 无责任Windows Azure SDK .NET开发入门篇二[使用Azure AD 进行身份验证-2.2身份验证开发]
  10. Samba 'smbcacls'命令安全绕过漏洞
  11. Javascript 函数和模块定义
  12. 把centos 网卡接口eth2改成eth0
  13. 初探Electron
  14. 项目Alpha冲刺Day6
  15. 基于Html5 Plus + Vue + Mui 移动App 开发(二)
  16. 前端笔记知识点整合之JavaScript(三)关于条件判断语句、循环语句那点事
  17. ArcGIS API for JS 测量线长(各折线段)
  18. day10 函数2
  19. SpringBoot集成ActiveMQ
  20. spark优化:spark.serializer修改序列化方式

热门文章

  1. 构建游戏开发的大数据项目的流程demo图
  2. osi7层模型及线程和进程
  3. Vue刷新token,判断token是否过期
  4. rocketmq设计
  5. rocketmq特性(features)
  6. linux运维、架构之路-MySQL(二)
  7. 代理上网(ssh 动态端口转发)
  8. Quick BI的宝藏工具——交叉表
  9. java获取当前时间的年周月季度等的开始结束时间
  10. R 动态定义变量名 assign