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 ...
随机推荐
- 课堂笔记 layout 布局、手风琴accordion、选项卡tabs
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 20165224 陆艺杰 Exp7 网络欺诈防范
通常在什么场景下容易受到DNS spoof攻击 一样的局域网环境下 在日常生活工作中如何防范以上两攻击方法 使用攻击检查工具 简单应用SET工具建立冒名网站 打开 apache服务 apache 是 ...
- Jmeter 自动化测试报告扩展(转 Todo 需要修正)
首先了解下生成测试报告的过程,我们看到的测试报告是由.jtl格式转换为.html,html报告的样式由extras目录下xsl文件决定.优化测试报告需要分为两部分内容,首先我们要优化输出的测试内容,其 ...
- kettle5.4ODBC和OCI连接配置
1.kettle 5.4 使用JDBC连接的时候报错(测试不同的数据库,发现只是连接11gRAC 的时候会报JDBC的错误) 具体报错如下 java.sql.SQLException: 建数据库连接出 ...
- (转)Bash Shell常用快捷键
Bash Shell常用快捷键 原文:https://github.com/hokein/Wiki/wiki/Bash-Shell%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B ...
- VirtualBox 在Centos 7 中安装增强功能 (共享文件夹)
1.分配光驱 2.安装相关依赖包 yum install -y bzip2 gcc gcc-devel gcc-c++ gcc-c++-devel make kernel-d 3.创建临时文件夹 mk ...
- shell脚本之前的基础知识
日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员.目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目.有的单位 ...
- 修改response,报错Cannot call getWriter(), getOutputStream() already called
往response里面改数据,然后系统报这个错 此时直接return null即可解决 但是,要想返回相应的页面呢? 可以直接在response里设置返回的页面
- php 05
流程控制 一.流程控制 1.顺序结构 //自上而下 从左到右 2.条件分支结构 a. 单向分支结构 if() 只能管理一条指令 这条指令是和他紧跟着的指令 if(){} 只能管理整个花括号里面的代码 ...
- 解决perl: warning: Setting locale failed.
在Ubuntu Server 12.04上执行apt-get install命令时,报如下warning 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...