本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目 

  输入两棵二叉树A和B,判断B是不是A的子结构。

思路

  1)先对A树进行遍历,找到与B树的根结点值相同的结点R;

  2)判断A树中以R为根结点的子树是否包含B树一样的结构。

测试算例 

  1.功能测试(A、B为普通二叉树;B是或者不是A树的子结构)

  2.特殊测试(任意一个或者两个树的根结点为null;左斜树;右斜树)

Java代码

//题目:输入两棵二叉树A和B,判断B是不是A的子结构。

public class SubstructureInTree {
public class TreeNode{
double val;
TreeNode left = null;
TreeNode right =null;
public TreeNode(int val) {
this.val=val;
}
} /*
* 主程序,对每个结点遍历判断
*/
public boolean hasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null || root2==null)
return false;
// boolean result=false;
// if(equal(root1.val, root2.val)) {
// result = doesTree1HasTree2(root1, root2);
// if(!result)
// result=hasSubtree(root1.left, root2)
// ||hasSubtree(root1.right, root2);
// }
// return result;
//上面几行可以直接写成:
return doesTree1HasTree2(root1, root2)|| hasSubtree(root1.left, root2)
||hasSubtree(root1.right, root2);
} /*
* 判断root结点开始的子树中各个结点是否相同
*/
private boolean doesTree1HasTree2(TreeNode root1,TreeNode root2) {
if(root2==null) return true;
if(root1==null) return false;
return equal(root1.val, root2.val) && doesTree1HasTree2(root1.left, root2.left)
&& doesTree1HasTree2(root1.right, root2.right);
} /*
* 判断两个浮点数是否相等
*/
private boolean equal(double num1,double num2) {
if(num1-num2<0.0000001 && num1-num2>-0.0000001 )
return true;
return false;
}
}

  

收获

  1.本题相当于对二叉树遍历的拓展,操作过程中,注意null的处理。

  2.注意判断浮点数相等时有误差,不要直接用“==”判断。

  

更多:《剑指Offer》Java实现合集  

  

【Java】 剑指offer(26) 树的子结构的更多相关文章

  1. 剑指 Offer 26. 树的子结构

    剑指 Offer 26. 树的子结构 Offer 26 题目详情: 题解分析 解法一: 第一种比较容易想到的解法就是查看这两棵树的前序遍历和中序遍历序列是否都匹配. 因为前序遍历和中序遍历可以唯一确定 ...

  2. 剑指offer——26树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构)   题解: 注意,所谓的子结构,是树的形状和值相同,并非判断B是不是A的一部分[如果是这样,那就是 ...

  3. 剑指Offer:树的子结构【26】

    剑指Offer:树的子结构[26] 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路 分为两步: 第一步:在树A中找到和树B的根节点的值一 ...

  4. 《剑指offer》 树的子结构

    本题来自<剑指offer> 树的子结构 题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分两步走: 第一步:判断根节点,两个根节 ...

  5. 【剑指Offer】树的子结构 解题报告(Python)

    [剑指Offer]树的子结构 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  6. 【剑指offer】树的子结构

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25907685 剑指offer第18题,九度OJ上測试通过! 题目描写叙述: 输入两颗二叉树 ...

  7. Go语言实现:【剑指offer】树的子结构

    该题目来源于牛客网<剑指offer>专题. 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) Go语言实现: type TreeNode stru ...

  8. 剑指Offer 17. 树的子结构 (二叉树)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目地址 https://www.nowcoder.com/practice/6e196c44c7 ...

  9. 剑指offer:树的子结构

    题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 解题思路: 同样考虑用递归来做. 利用两个递归函数,一个用于判断两棵树树否相等,另一个递归取A的 ...

随机推荐

  1. OOM之类、对象、实例、实体之辨析

    一.场景再现         有一个重要的概念你需要弄明白,那就是“类(class)”和“对象(object)”的区别.我用禅语来解释一下吧:         鱼和三文鱼有什么区别?         ...

  2. cpp与其他语言相比较

    new  相当于 malloc ,delete 相当于  free ,用法一样 c++ 有 namespace,可以避免类名污染  namespace xx{} c++ 有类 这个与 c#.as3比较 ...

  3. tomcat server.xml

    基于对server.xml的学习,结合源码,可以进一步理解tomcat的架构设计 1. 2. 3. 4 .valve链 参考: http://www.importnew.com/17124.html ...

  4. mysql原理~undo

    mysql undo详谈1 简介:undo是MVCC机制的基础部分之一2 作用:为了实现可重复性读,存储历史数据3 存储:5.6以前undo都存储在内存和ibdata1中,5.6以后undo可以独立成 ...

  5. jquery 学习(七) - 常用动态效果

    <!--转载于 听说你的代码很6--><!--http://www.jq22.com/webqd2377--> CSS <style> #content #firs ...

  6. Linux查找文件、文件夹

    https://www.jianshu.com/p/f3a46e5c96ba 查找目录:find /(查找范围) -name '查找关键字' -type d 查找文件:find /(查找范围) -na ...

  7. commons-lang3-3.2.jar中的常用工具类的使用

    这个包中的很多工具类可以简化我们的操作,在这里简单的研究其中的几个工具类的使用. 1.StringUtils工具类 可以判断是否是空串,是否为null,默认值设置等操作: /** * StringUt ...

  8. python中 __name__及__main()__的妙处

    python中 __name__及__main()__的妙处 #hello.pydef sayHello(): str="hello" print(str); if __name_ ...

  9. Linux内核驱动之GPIO子系统(一)GPIO的使用【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/9427047 一 概述 Linux内核中gpio是最简单,最常用的资源(和 interrupt  ...

  10. 在Linux,误删磁盘分区怎么恢复呢【转】

    在我们运维工作中,频繁的操作,可能命令写入错误,造成磁盘分区的删除,那么应该怎么办呢?怎么恢复磁盘分区呢? 一不小心删除了磁盘分区.如下图,删除了sda磁盘的第一个分区,为系统boot分区,系统如果重 ...