剑指offer——树的子结构 (JAVA代码)
版权声明:本文为博主原创文章,未经博主允许不得转载。
题目描述:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。
解题思路:
首先看牛客网给出的测试用例:

一般对于树的操作不像链表一样,操作更复杂,如果使用循环遍历的话,对于非完全二叉树规律难寻,一般通用的方法就是使用递归求解,本题也不例外,同样使用递归求解,求解的大体思路是首先判断B的根节点和A的根节点是否相同(这里的相同是指节点的值相同并且左右子节点相同),如果相同比较他们的左右子节点,这一步骤是相同的,可以用递归完成,直到B遍历到每个尾节点,如果这一过程比较的所有节点是相同的,则证明B是A的子结构。如果B的根节点和A的根节点不同,则A向他的左右子节点滑动,然后继续跟B的子节点比较,步骤同上。
递归的使用可以用我总结的三步来完成。求解过程如下:
源码:
/**
* 输入两棵二叉树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代码)的更多相关文章
- 剑指Offer 树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 思路: 分为2个部分.1先找出A中和B根节点相同的节点r. 2,咱判断B中所有孩子节点是不 ...
- 剑指Offer——树的子结构
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 先匹配到A的某个结点和B的根相同,然后往下继续匹配.不匹配则递归匹配左右子树. 代码: ...
- 用js刷剑指offer(树的子结构)
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 牛客网链接 js代码 /* function TreeNode(x) { this.val = x ...
- 剑指 offer 树的子结构
题目描述: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构). 第一遍没写出来错误点:认为首先应该找到pRoot1等于pRoot2的节点,但是递归就是自己在不 ...
- 剑指Offer-17.树的子结构(C++/Java)
题目: 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析: 注意这道题是判断B是不是A的子结构,而不是子树,这一点要注意下,且空树不是任意一个树的子结构 ...
- [剑指Offer]26-树的子结构
题意 判断一棵树(参数二)是不是另一棵树(参数一)的子结构. 题解 递归第一棵树,找两棵树中值一样的节点.若找到后,用另一个函数判断以相同值得节点为根的树2是不是树1的子结构. 代码 class Tr ...
- 剑指offer--24.树的子结构
时间限制:1秒 空间限制:32768K 热度指数:407165 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) class Solution ...
- 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...
- 剑指Offer编程题(Java实现)——数组中的重复数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
随机推荐
- PDMS模型导出RVM格式
2 .将PDMS中对象模型导出为RVM格式的宏文件代码如下: eg:如果要导出某几个房间内的全部bran equi !strus = array()!strus.append(|/1RXR246ZL| ...
- NONUNIFORM MEMORY ACCESS
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In terms of commercia ...
- 退出recoveyr模式的iOS设备
大致分析了一下几款工具,大概流程是: 使用AMDRestoreRegisterForDeviceNotifications来监听设备的连接. 监听设备连接的回调函数中获取设备的句柄. 调用AMReco ...
- jQuery 一句代码返回顶部
兼容各大主流浏览器,jQuery返回顶部,一句代码搞定 <a class="top" href="javascript:;" style="po ...
- linux系统文件权限
Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录.通过设定权限可以从以下三种访问方式限制访问权限:只允许 ...
- django--models操作
1.models的功能 操作数据库 提交验证 在django的admin中,使用的是modelForms所以在验证的时候,尽管在models后有error_ message参数也不会根据此来提示.具体 ...
- Python学习笔记 for windows 二
函数 abs(-20) //结果为:20,绝对值函数 def 函数名称([参数1,参数2,参数3]): 执行语句 retu ...
- 通过href简单实现单击a链接跳转到页面指定位置
在页面中点击a标签后,要使其跳到页面里面相应的地方,方法很简单,就是在a标签里面href中的内容和你要跳到这个区域的id同名即可,例如: <a href="#ppp" tar ...
- Python开发程序:学员管理系统(mysql)
主题:学员管理系统 需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图: 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节 ...
- [CC]点云密度计算
包括两种计算方法:精确计算和近似计算(思考:local density=单位面积的点数 vs local density =1/单个点所占的面积) 每种方法可以实现三种模式的点云密度计算,CC里面的 ...