版权声明:本文为博主原创文章,未经博主允许不得转载。

题目描述

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

解题思路:

  首先看牛客网给出的测试用例:

  

  一般对于树的操作不像链表一样,操作更复杂,如果使用循环遍历的话,对于非完全二叉树规律难寻,一般通用的方法就是使用递归求解,本题也不例外,同样使用递归求解,求解的大体思路是首先判断B的根节点和A的根节点是否相同(这里的相同是指节点的值相同并且左右子节点相同),如果相同比较他们的左右子节点,这一步骤是相同的,可以用递归完成,直到B遍历到每个尾节点,如果这一过程比较的所有节点是相同的,则证明B是A的子结构。如果B的根节点和A的根节点不同,则A向他的左右子节点滑动,然后继续跟B的子节点比较,步骤同上。

  递归的使用可以用我总结的三步来完成。求解过程如下:

  1. 递归截止条件。
  递归的截止条件是为了递归能够避免无限循环下去,首先来分析什么情况下递归截止返回遍历结果,(1)根据题目要求,如果B数是个空树,递归截止。(2)如果被遍历的树A是空树,自然而然递归截止。(3)如果比较的是B的尾节点,无法进行下去,递归也会截止。(4)如果A树从头遍历到尾始终没有和B的节点相同的节点,递归截止。
  2. 递归的前后衔接。
  如果A的根节点值以及左右子节点情况和B的根节点完全相同,那么A和B都继续滑动到他们的左右子节点进行比较;如果A的根节点值和B的根节点值是相同的,但是左右子节点的情况是不相同的,那么只滑动A到他的左右子节点再与B比较。如果A的根节点的值和B的根节点的值不相同,那么A直接滑动到他的左右自己点再和B的根节点比较,直到遍历完成。
  3. 递归节点数据的处理。
  根据题目,本题目中用到的递归并没有数据处理,只是比较判断两个树节点是否相同。对于其他递归,可以具体情况具体对待。

源码:

     /**
* 输入两棵二叉树A,B,判断B是不是A的子结构。
* @param root1 A树
* @param root2 B数
* @return
*/
public static boolean HasSubtree(TreeNode root1,TreeNode root2) { if (root2==null) { //空树不是任意一个树的子结构
return false;
}
if (root1==null) { //如果A为空,那肯定返回false
return false;
}
if(root2.val==root1.val){ //A和B比较的根节点的值相同 if (root2.left==null&&root2.right==null) { //比较的节点是B的尾节点,递归截止
return true;
}
//下面三种比较的是比较的节点完全相同的情况
if ((root2.left!=null&&root2.right!=null)&&(root1.left!=null&&root1.right!=null)&&root2.left.val==root1.left.val&&root2.right.val==root1.right.val) {
return HasSubtree(root1.left,root2.left)&& HasSubtree(root1.right,root2.right);
}else if ((root2.left!=null&&root2.right==null)&&(root1.left!=null&&root1.right==null)&&root2.left.val==root1.left.val) {
return HasSubtree(root1.left,root2.left);
}else if ((root2.left==null&&root2.right!=null)&&(root1.left==null&&root1.right!=null)&&root2.right.val==root1.right.val) {
return HasSubtree(root1.right,root2.right);
}else{ //比较的节点不同,A向左右子节点移动一个再比较
if (root1.left!=null&&root1.right!=null) {
return HasSubtree(root1.left,root2)|| HasSubtree(root1.right,root2);
}else if(root1.left==null&&root1.right!=null){
return HasSubtree(root1.right,root2);
}else if(root1.left!=null&&root1.right==null){
return HasSubtree(root1.left,root2);
}else {
return false;
}
}
//比较的根节点的值不相同,直接向左右子节点滑动
}else if(root1.left!=null&&root1.right==null){
return HasSubtree(root1.left,root2);
}else if(root1.left==null&&root1.right!=null){
return HasSubtree(root1.right,root2);
}else{
return false;
}
}

剑指offer——树的子结构 (JAVA代码)的更多相关文章

  1. 剑指Offer 树的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构)     思路: 分为2个部分.1先找出A中和B根节点相同的节点r. 2,咱判断B中所有孩子节点是不 ...

  2. 剑指Offer——树的子结构

    题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 先匹配到A的某个结点和B的根相同,然后往下继续匹配.不匹配则递归匹配左右子树. 代码: ...

  3. 用js刷剑指offer(树的子结构)

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 牛客网链接 js代码 /* function TreeNode(x) { this.val = x ...

  4. 剑指 offer 树的子结构

    题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 第一遍没写出来错误点:认为首先应该找到pRoot1等于pRoot2的节点,但是递归就是自己在不 ...

  5. 剑指Offer-17.树的子结构(C++/Java)

    题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 注意这道题是判断B是不是A的子结构,而不是子树,这一点要注意下,且空树不是任意一个树的子结构 ...

  6. [剑指Offer]26-树的子结构

    题意 判断一棵树(参数二)是不是另一棵树(参数一)的子结构. 题解 递归第一棵树,找两棵树中值一样的节点.若找到后,用另一个函数判断以相同值得节点为根的树2是不是树1的子结构. 代码 class Tr ...

  7. 剑指offer--24.树的子结构

    时间限制:1秒 空间限制:32768K 热度指数:407165 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构)   class Solution ...

  8. 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面

    题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...

  9. 剑指Offer编程题(Java实现)——数组中的重复数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

随机推荐

  1. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

  2. Tomcat(多版本)安装注意!

    ♣电脑安装多个版本的tomcat和切换(解压版的apache-tomcat   -5.5.0/   -6.0.45/  -7.0.70  三个版本) ♣tomcat配置环境变量 ♣tomcat5.5. ...

  3. apache2.2 做后端,增加真实ip到日志中

    apache2.2使用mod_remoteip模块 一.安装 wget https://github.com/ttkzw/mod_remoteip-httpd22/raw/master/mod_rem ...

  4. C#.Net下的防抖-Debounce和节流阀-Throttle功能实现

    C#下的防抖-Debounce.节流阀-Throttle功能实现 防抖-Debounce 连续的多次调用,只有在调用停止之后的一段时间内不再调用,然后才执行一次处理过程. 节流阀-Throttle 连 ...

  5. js == 与 === 的区别,‘’与“”的区别

    js == 与 === 的区别 1.对于string,number等基础类型,==和===是有区别的 1)不同类型间比较,==之比较"转化成同一类型后的值"看"值&quo ...

  6. html5相关知识点的总结(有一些错误或者不足的地方)

    1.页面结构上的一些宽松改变 <!DOCTYPE html>默认为标准模式 <meta charset="UTF-8"> 2.html5中新增的一些语义化标 ...

  7. 使用openvswitch 和dnsmasq来实现虚拟机网络隔离

    openvswicth : 开源的网络虚拟化软件,可以划分vlan隔离虚拟机,做流量控制 dnsmasq:小心的dns,dhcp服务器 安装openvswicth wget  http://openv ...

  8. gulp任务

    项目使用的gulp自动化任务 //定义输出文件夹名称 var distFolderH5 = "distH5"; var distFolderMofang = "distM ...

  9. 动态调频DVFS_转

    转自: Linux Core Power Management User's Guide (v3.14) http://processors.wiki.ti.com/index.php/Linux_C ...

  10. SQL Server 不清空数据,修改数据库字段、结构,阻止保存要求重新创建表的更改

    当数据库有数据修改数据库字段时,默认是阻止的! 工具---选项---设计器---阻止保存要求重新创建表的更改(取消钩)