题目描述

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

题目代码

/**
* 输入两棵二叉树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基础编程——树的子结构的更多相关文章

  1. 6、50道JAVA基础编程练习题跟答案

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析 ...

  2. MQ java 基础编程

    MQ java 基础编程 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : wenjunwu430@gmail.com 前言 通过 2 个多星期对 MQ 学习,在 partner 丁 & ...

  3. 50道JAVA基础编程练习题

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...

  4. 50道JAVA基础编程练习题 - 题目

    50道JAVA基础编程练习题[1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? [2]题目:判断 ...

  5. JAVA基础——编程练习(二)

    JAVA编程练习(二) 今天我为了巩固之前的java基础知识的学习,再次进行实战演习,编写了一个小小的java控制台程序,主要是运用java面向对象的思想来完成这个小项目. 一.项目背景介绍 根据所学 ...

  6. JAVA基础——编程练习(一)

    java编程练习(一) 编程题目: 请根据所学知识,编写一个 JAVA 程序,实现输出考试成绩的前三名. 要求: 1. 考试成绩已保存在数组 scores 中,数组元素依次为 89 , -23 , 6 ...

  7. 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 ...

  8. java基础编程题练习(一)

    1.编程实现用户输入4个整数,按从大到小的顺序排列输出. 思路:将输入的数据存入数组,使用冒泡排序对数组数据进行排序后输出数组 冒泡排序的代码如下: import java.util.Scanner; ...

  9. java基础编程

    java的类和常用编程模式还是要多练习,多手写java代码 return new String(filecontent, encoding); 看懂这个意思了吗?第一次见这个构造函数吧,而String ...

随机推荐

  1. k8s集群新增节点

    节点为centos7.4 一.node节点基本环境配置 1.配置主机名 2.配置hosts文件(master和node相互解析) 3.时间同步 ntpdate pool.ntp.org date ec ...

  2. thinkphp实现登录后返回原界面

    主要思路还是用session记录原地址,在登录后再跳转回原界面 先保存请求login方法界面的url public function savelogin(){ session('returnUrl', ...

  3. LeetCode初级算法(树篇)

    目录 二叉树的最大深度 验证二叉搜索树 对称二叉树 二叉树的层次遍历 将有序数组转换为二叉搜索树 二叉树的最大深度 二叉树,所以可以考虑用递归来做.由于根节点已经算过了,所以需要加上1:每次返回都是以 ...

  4. Qt学习之网络编程(一)

    一些说明 学了有一段时间的python了,小项目做了不少,最近由于项目需要,所以要回归老本行了,开始重点突击C++和qt.python的网络爬虫系列有时间就更吧. 获取本机网络信息 在网络应用中,经常 ...

  5. 项目 07 Model与数据优化

    项目班 07 Model与数据优化 html默认可以用直接用的方法和变量 {{ static_url(p.image_url) }} #static_url表示直接获取静态文件url {{ handl ...

  6. python_魔法方法(一):构造和析构

    魔法方法总是被双下划线包围,例如:__init__() 魔法方法是面向对象的python的一切,它的魔力体现在总能在合适的时候调用. 先来介绍析构和构造的三个魔法方法: __init__():构造方法 ...

  7. 16-----client、offset、scroll 系列

    1.client 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  8. jquery——制作置顶菜单

    置顶菜单: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  9. HDU 5775 L - Bubble Sort 树状数组

    给定一段冒泡排序的代码,要求输出每个数字能到达的最右边的位置和最左边的位置的差 因为那段冒泡排序的代码是每次选取一个最小的数,放在左边的,所以,每个数最多能到达右边的位置应该是起始位置i+右边有多少个 ...

  10. java NIO-java.io

    1. 传统IO-面向流 1.1 基于字节的IO接口 In/OutputStream 1.2 基于字符的IO接口 Reader/Writer Reader提供抽象方法: int read(char cb ...