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 ...
随机推荐
- 单机部署zookeeper、kafka
先安装jdk:mkdir /usr/javatar xf jdk-8u151-linux-x64.tar.gzmv jdk1.8.0_151/ /usr/java/jdk1.8 cat /etc/pr ...
- Nginx停止服务和各种命令
1.停止Nginx服务的四种方法 从容停止服务这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止. nginx -s quit 立即停止服务这种方法比较强硬,无论进程是否在工作,都直 ...
- 在HEXO主题中添加数学公式支持
在markdown中书写数学符号的方式参考Latex常用数学符号 Mathjax 安装 npm uninstall hexo-renderer-marked --save npm install he ...
- POJ 1410 Intersection 数据错误
题目要求判断一条线段和一个矩形是否相交,或者是否在矩形里面(题目好像没说?) 思路就是直接暴力判断和矩形四条边是否相交,和线段的坐标是否在矩形的坐标范围即可. 然后题目的数据,(xleft,ytop) ...
- POI Java 导出数据到Excel
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifac ...
- .Net core使用XRPC创建远程接口的Actor对象
Actor是一种高并发处理模型,每个Actor都有着自己的状态有序消息处理机制,所以在业务处理的情况并不需要制定锁的机制,从而达到更高效的处理能性.XRPC是一个基于远程接口调用的RPC组件,它可以简 ...
- Maven的学习资料收集--(八) 构建MyBatis项目
在这里,写一下,怎么使用Maven构建MyBatis项目. 1. 新建一个Web项目 可以参考前面的博客 2. 修改pom.xml,添加MyBatis依赖 <project xmlns=&quo ...
- java CountDownLatch 等待多线程完成
CountDownLatch允许一个或多个线程等待其他线程完成操作. package com.test; import java.util.concurrent.CountDownLatch; pub ...
- vuex文档(附加个人理解)
Vuex是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到Vue 的 ...
- 17.NET Core WebApi跨域问题
官方说明 CORS means Cross-Origin Resource Sharing. Refer What is "Same Origin" Part Detailed P ...