java基础编程——树的子结构

题目描述

输入两棵二叉树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;
        }
    }

原文地址:https://www.cnblogs.com/FanJava/p/9578702.html

时间: 2024-11-09 03:59:00

java基础编程——树的子结构的相关文章

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

1 50道JAVA基础编程练习题 2 [程序1] 3 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 4 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 5 public class Prog1{ 6 public static void main(String[] args){ 7 int n = 10; 8 System.out.println("第"+n+

JAVA基础编程练习题

50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... public class Prog1{ public static void main(String[] args){ int n = 10; System.out.println("第"+n+"个月兔子总数为&qu

50道JAVA基础编程练习题

50道JAVA基础编程练习题[程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....public class Prog1{public static void main(String[] args){ int n = 10; System.out.println("第"+n+"个月兔子总数为"+f

MQ java 基础编程(一)

本文转自:http://www.blogjava.net/i369/articles/88035.html 编写人:邬文俊 编写时间 : 2006-2-16 联系邮件 : [email protected] 前言 通过 2 个多星期对 MQ 学习,在 partner 丁 & partner 武 的帮助下完成了该文档.该文档提供一个简单的例子,通过对该例子的讲解,你将知道: 1.         用 java 写客户端从 MQ Server 收发消息. 2.         MQ 作为 Websp

java基础编程题

java基础编程题 1.打印出如下图案 1 public class Prog19{ 2 public static void main(String[] args){ 3 int n = 5; 4 printStar(n); 5 } 6 7 //打印星星 8 private static void printStar(int n){ 9 //打印上半部分 10 for(int i=0;i<n;i++){ 11 for(int j=0;j<2*n;j++){ 12 if(j<n-i) 1

JAVA基础编程50题(7-9题)详解

一.描述 1.输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的总个数和每个字符出现的频率. 程序分析:使用String类的matchs()分别统计符合正则表达式的每类字符的总个数,然后分别使用List和Map集合类统计每个字符出现的频率. 2.求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制. 3.题目:一个数如果恰好等于它的因子之和,这个数就称为"完数",即除了本身

Java 基础编程练习题

1.编写程序实现对给定的 4 个整数从大到小的顺序排列. package HomeWork01; import java.util.Scanner; public class HomeWork01 { static int number=4; //输入4个数存放在数组中 static int[] t1 = new int[number]; public static void main(String[] args) { HomeWork01 jiejie=new HomeWork01(); ji

JAVA基础编程50题(13-15题)详解

一.描述 1.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上168后再开方,如果开方后再平方等于原数则符合结果. 2.输入某年某月某日,判断这一天是这一年的第几天? 程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天. 3.输入三个整数x,y,z,请把这三个数由小到大输出. 程序分析:将最小的数放到x上,先

JAVA基础编程50题(22-24题)详解

一.描述 题目1:统计输入的一段字符串,分别统计这个字符串中大小写字母的个数,以及数字出现的次数. 第一种方法使用Character封装类的方法:isLowerCase(),isUpperCase(),isDigit()判断是否是该类字符, 第二种方法是直接使用char字符范围比较来统计. 题目2:用户输入一串待统计的字符串,然后输入用户想要统计的某个单词或者字符的次数. 比如我输入如下字符串:fdhiaojavajidaoijdjava 我要统计其中的java字符串的个数. 解题思路:传入待统