java基础编程——树的子结构
题目描述
题目代码
/**
* 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
* Created by YuKai Fan on 2018/9/3.
*/
public class HasSubTree {
public static void main(String[] args) {
TreeNode a = new TreeNode(2);
a.left = new TreeNode(4);
a.right = new TreeNode(6);
a.left.left = new TreeNode(7);
a.left.right = new TreeNode(9);
a.right.right = new TreeNode(21);
a.right.left = new TreeNode(14); TreeNode a1 = new TreeNode(2);
a1.left = new TreeNode(4);
a1.right = new TreeNode(6);
boolean b = hasSubTree(a, a1);
System.out.println(b);
} public static boolean hasSubTree(TreeNode root1, TreeNode root2) {
boolean result = false;
//判断前提两个树都是非空的
if (root1 != null && root2 != null) {
//如果存在root1的节点与root2的根节点相等
if (root1.val == root2.val) {
//以root2的根节点为起点判断是否包含root2
result = isSubTree(root1, root2);
}
//如果找不到,就去root1的左子树循环递归
if (!result) {
result = hasSubTree(root1.left, root2);
}
//如果左子树也找不到,就去root1的右子树循环递归
if (!result) {
result = hasSubTree(root1.right, root2);
}
}
return result;
}
public static boolean isSubTree(TreeNode root1, TreeNode root2) {
//如果root2遍历完了都能在root1中对应上,返回true
if (root2 == null) {
return true;
}
//如果root1遍历完了,而root2还没结束,则说明root1不包含root2 ,返回false
if (root1 == null) {
return false;
}
//如果其中有一个点没有对应上,返回false
if (root1.val != root2.val) {
return false;
}
//如果根节点对应上,那么就分别去子节点中匹配
return isSubTree(root1.left, root2.left) && isSubTree(root1.right, root2.right);
}
}
/**
* Created by YuKai Fan on 2018/9/3.
*/
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
} }
题目延伸
二叉树的子树和子结构
子树的意思是只要包含了一个节点,就必须包含这个节点下的所有节点
子结构的意思是包含了一个节点,可以取左子树或者右子树,或者都不取
简单的说,就是子结构可以是树的任何一部分
下面举个简单的例子:
如下图1是7节点,高度为3的二叉树
图1:

图1的子树可以是:

图1的子结构为:
由于子结构可以是原树的任意一个部分,因此图4就是一个子结构。

如何判断二叉树的子树
分析:因为子树表示,如果包含了一个节点,就必须包括节点下的所有节点。(所以上图4,不是树的子树。而是子结构!!!)
所以代码在上面的基础上修改isSubTree()的代码
public static boolean isSubTree2(TreeNode root1, TreeNode root2) {
/*因为子树表示,如果包含了一个节点,就必须包括节点下的所有节点。
所以只有当root1与root2同时遍历结束都为空时,才能返回true
*/
if (root1 == null && root2 == null) {
return true;
} else if (root1 != null && root2 != null) {
if (root1.val != root2.val) {
return false;
}
return isSubTree2(root1.left,root2.left) && isSubTree2(root1.right, root2.right);
} else {
return false;
}
}
java基础编程——树的子结构的更多相关文章
- 6、50道JAVA基础编程练习题跟答案
50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 ...
- MQ java 基础编程
MQ java 基础编程 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : wenjunwu430@gmail.com 前言 通过 2 个多星期对 MQ 学习,在 partner 丁 & ...
- 50道JAVA基础编程练习题
50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...
- 50道JAVA基础编程练习题 - 题目
50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...
- JAVA基础——编程练习(二)
JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...
- JAVA基础——编程练习(一)
java编程练习(一) 编程题目: 请根据所学知识,编写一个 JAVA 程序,实现输出考试成绩的前三名. 要求: 1. 考试成绩已保存在数组 scores 中,数组元素依次为 89 , -23 , 6 ...
- java基础编程练习
1.编写程序实现对给定的 4 个整数从大到小的顺序排列. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- java基础编程题练习(一)
1.编程实现用户输入4个整数,按从大到小的顺序排列输出. 思路:将输入的数据存入数组,使用冒泡排序对数组数据进行排序后输出数组 冒泡排序的代码如下: import java.util.Scanner; ...
- java基础编程
java的类和常用编程模式还是要多练习,多手写java代码 return new String(filecontent, encoding); 看懂这个意思了吗?第一次见这个构造函数吧,而String ...
随机推荐
- Technical support website
Technical support:Please leave a message if you have any questions or suggestions. email: swvrwafet@ ...
- 长春理工大学第十四届程序设计竞赛(重现赛)M.Orx Zone
链接:https://ac.nowcoder.com/acm/contest/912/M 题意: Daenerys Stormborn, 风暴中出生的丹尼莉丝,the Unburnt, 烧不死的,Qu ...
- 分层图 (可以选择K条路的权为0,求最短路)
分层图可以处理从图中选取k条边使其边权变为0,求最短路 Description 在你的强力援助下,PCY 成功完成了之前的所有任务,他觉得,现在正是出去浪的大好时光.于是,他来到高速公路上,找到一辆摩 ...
- Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件
一.Django与Ajax AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻 ...
- 使用C#连接 MyCat 链接串
所属专栏: mycat的安装部署以及监控和运维 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014180504/article/detai ...
- jsonp——使用公共接口获取数据
demo: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...
- (转)CentOS 7系统详细开机启动流程和关机流程
CentOS 7系统详细开机启动流程和关机流程 原文:http://blog.csdn.net/yuesichiu/article/details/51350654 名称 bootup - 系统启动流 ...
- launchctl
Launchctl 系统启动时, 系统会以root用户的身份扫描/System/Library/LaunchDaemons和/Library/LaunchDaemons目录, 如果文件中有Disabl ...
- SpringBoot | 第二十一章:异步开发之异步调用
前言 上一章节,我们知道了如何进行异步请求的处理.除了异步请求,一般上我们用的比较多的应该是异步调用.通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的.比如记录日志信息等业务.这个时候 ...
- jQuery图片组展示插件----Galleria使用简介
1.技术目标 掌握Galleria插件的基本操作 2.Galleria简介 Galleria是一个jQuery插件,可用于展示多张图片,操作也比较简单, 展示效果也非常不错,如图: 提示:Galler ...