Java-数据结构-二叉树-习题(一) (✪ω✪)

news2024/11/19 23:19:01

文本目录:

❄️一、习题一(检查两颗树是否相同):

   ▶ 思路:

   ▶ 代码:

 ❄️二、习题二(另一棵树的子树):

   ▶ 思路:

   ▶ 代码:

 ❄️三、习题三(翻转二叉树):

   ▶ 思路:

    ▶ 代码:

❄️四、习题四(对称二叉树):

    ▶ 思路:

    ▶ 代码:

❄️五、习题五(平衡二叉树):

    ▶ 思路:

     ▶ 代码:

 ❄️六、习题六(二叉树的构建和遍历):

    ▶ 思路:

      ▶ 代码:

 ❄️七、总结:


❄️一、习题一(检查两颗树是否相同):

          ☑ 题的链接:

                     相同的树


   ▶ 思路:

      这个题呢我们需要判断 两个二叉树的结构是否相同,并且节点的值是否相同,所以呢,我们遍历二叉树来看看 两个二叉树的所对应的结构和节点数值是否相同。

     我们在结构上呢,我们有两种情况:

第一种:p 这个二叉树对应的节点不为空,q 这个二叉树对应的节点为空。

第二种:p 这个二叉树对应的节点为空,q 这个二叉树对应的节点不为空。

   当我们这两个二叉树所对应的节点结构是都为空,或这都不为空的时候呢,就是我们的结构是一样的,之后我们再来判断这两个节点所对应的值是否相同。

    所以呢我们是先来判断结构是否相同,之后判断节点的值是否相同。 这里呢,我们也使用的是递归方法。我们来看看思路图:

   ▶ 代码

 接下来我们来看看代码的编写:

public boolean isSameTree(TreeNode p, TreeNode q) {
        //先判断p和q的结构
        if (p != null && q == null || p == null && q != null) {
            //结构出现错误
            return false;
        }

        //可能是因为都为null或者都不为空
        //都为空下:
        if (p == null && q == null) {
            return true;
        }

        //都不为空
        //判断对相应的节点的值是否一样
        if (p.val != q.val) {
            return false;
        }

        //走到这,就是这个节点判断完成,并且是相同的,我们之后去其左子树和右子树检查
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
        //我们递归正确返回的是真
    }

 ❄️二、习题二(另一棵树的子树):

          ☑ 题的链接:

                   另一棵树的子树


   ▶ 思路:

       我们的这道题呢,和我们的上面的代码是有关系的,我们这到题呢也是需要对于节点的结构和对应的节点值进行比较,当我们在 root 里面遍历当我们的遍历出和我们的 subRoot 这个根结点相同的时候呢,我们进行 root 和 subRoot 共同遍历在我们没有比较出和 subRoot 根结点相同之前呢,我们只有 root 遍历

判断子树和当前的 root 的左子树一样?

判断子树和当前的 root 的右子树一样?

   ▶ 代码

我们来看看代码是如何实现的: 

public boolean isSameTree(TreeNode p, TreeNode q) {
        //先判断p和q的结构
        if (p != null && q == null || p == null && q != null) {
            //结构出现错误
            return false;
        }

        //可能是因为都为null或者都不为空
        //都为空下:
        if (p == null && q == null) {
            return true;
        }

        //都不为空
        //判断对相应的节点的值是否一样
        if (p.val != q.val) {
            return false;
        }

        //走到这,就是这个节点判断完成,并且是相同的,我们之后去其左子树和右子树检查
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
        //我们递归正确返回的是真
    }

    //另一棵树的子树
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if (root == null) {
            return false;
        }

        if (isSameTree(root,subRoot)) {
            return true;
        }
        if (isSubtree(root.left,subRoot)) {
            return true;
        }
        if (isSubtree(root.right,subRoot)) {
            return true;
        }

        return false;
    }

 ❄️三、习题三(翻转二叉树):

          ☑ 题的链接:

                       翻转二叉树

   ▶ 思路:

      这道题呢,还是非常简单的,我们只需要把根的左子树和右子树进行替换,之后我们遍历我们的左子树和右子树再执行替换操作。我们来看看思路:

    ▶ 代码

我们来看看代码如何编写的:

public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        //进行当前根的左子树和右子树的替换
        TreeNode cur = root.left;
        root.left = root.right;
        root.right = cur;

        //到根的左子树和右子树去替换
        //这里用遍历
        invertTree(root.left);
        invertTree(root.right);

        return root;
    }

❄️四、习题四(对称二叉树):

          ☑ 题的链接:

                      对称二叉树


    ▶ 思路:

    我们这道题呢,和我们判断 两棵树是否相等 是相类似的,我们什么情况下我们的二叉树是对称的呢?在我们二叉树的 左右子树是在结构上和对应节点的值是相等的时候就是相等的,这时候呢,我们的二叉树就是对称二叉树。对称二叉树要注意的是:我们的左子树的节点应该和右子树的是相等的,而不是左子树节点和左子树节点相等。

     我们先来看看不为对称二叉树的情况:

  正确的情况图: 所以我们要判断:

1、根的左子树是否为空

2、根的右子树是否为空

3、左子树的节点的值和右子树的节点的值是否相等

这里我们要注意的是:

   我们递归的时候呢,我们要判断 左子树的左子树和右子树的右子树左子树的右子树和右子树的左子树

    ▶ 代码

我们来看看代码:

public boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree) {
        //结构不一样的情况下
        if (leftTree != null && rightTree == null
                || leftTree == null && rightTree != null) {
            return false;
        }
        //在结构一样的情况下左右子树都等于空
        if (leftTree == null && rightTree == null) {
            return true;
        }
        //在结构一样的情况下左右子树都不等于空
        //我们来判断左值和右值是否相等
        if (leftTree.val != rightTree.val) {
            return false;
        }

        //之后我们来遍历左子树的子树,右子树的右子树,再次判断是否结构相等和值是否相等
        return isSymmetricChild(leftTree.left,rightTree.right) &&
                isSymmetricChild(leftTree.right,rightTree.left);
    }
    public boolean isSymmetric(TreeNode root) {
        if (root == null) {
            return false;
        }

        return isSymmetricChild(root.left,root.right);
    }

❄️五、习题五(平衡二叉树):

          ☑ 题的链接:

                      平衡二叉树


    ▶ 思路:

     如果我们想要判断是否是平衡二叉树呢,我们的左子树的高度和有字数的高度用需要 < 2,我们不只是需要判断 根结点的高度差是否 < 2,我们需要判断每一颗子树的高度差是否 < 2,如果大于 2 那么就不是平衡二叉树了

      这样理解之后呢,就是非常简单的了,我们需要使用我们上个博客写的求高度的方法,用来求高度,去求高度差,我们不只是需要判断根节点还需要判断根节点的左子树和根节点的右子树的高度差是否 < 2

     ▶ 代码

 我们来看看这道题的代码如何编写的:


public int getHeight(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);

        //谁高谁加一
        return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
    }
    //平衡二叉树
    public boolean isBalanced(TreeNode root) {
        if (root == null) {
            return true;
        }

        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        
        //Math.abs是取绝对值
        return Math.abs(leftHeight - rightHeight) < 2 
                && isBalanced(root.left)
                && isBalanced(root.right);
    }

 ❄️六、习题六(二叉树的构建和遍历):

              ☑ 题的链接:
                             二叉树的构建和遍历


    ▶ 思路:

      我们呢这道题同样使用递归的思想来编写代码,这个呢是当我们在遇到 ‘#’ 的时候是为空的,我们按照前序遍历来把二叉树进行创建,第一个字符为根节点,之后我们就按照前序遍历的思想来进行编写代码,我们需要一个下标来遍历字符串,当遇到字符时候放入二叉树中,当为 ‘#’ 时呢,节点为空,就可以了。所以我们的思路就是:

1、先创建根节点

2、创建左子树

3、创建右子树

 

这个呢就是这道题的思路了,我们来看看这个代码是如何编写的: 

      ▶ 代码

import java.util.Scanner;
class TreeNode {
    public char val;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(char val) {
        this.val = val;
    }
}

public class Main {
    public static int i = 0;
    public static TreeNode creatTree(String str) {
        TreeNode root = null;

        if (str.charAt(i) != '#') {
            root = new TreeNode(str.charAt(i));
            i++;
            root.left = creatTree(str);
            root.right = creatTree(str);
        } else {
            i++;
        }
        return root;
    }

    public static void inOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        inOrder(root.left);
        System.out.print(root.val + " ");
        inOrder(root.right);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String str = in.nextLine();
            TreeNode root = creatTree(str);
            inOrder(root);
        }
    }
}

OK,我们这道题到这里就结束了。 


 ❄️七、总结:

     OK,我们这次关于二叉树的习题的练习就到这里就结束了,我们在做这种二叉树的题的时候时刻都不要忘记递归的思想。我们呢下篇博客呢还是介绍关于我们二叉树的练习题了,让我们尽情期待吧!!!拜拜~~~

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】STL容器-string的遍历

1.引言 C STL&#xff08;Standard Template Library&#xff09;作为C标准库的核心部分&#xff0c;其重要性不言而喻。它提供了一系列高效、灵活且可复用的数据结构和算法&#xff0c;极大地提升了开发效率&#xff0c;并使得代码更加易于阅读和维护。 在STL中&#xff0c;…

​中国版Sora:Vidu发布“主体参照”功能,支持让任意主体保持一致

OpenAI发布Sora模型后&#xff0c;掀起了AI视频生成热潮&#xff0c;一段60秒的视频不仅让ai领域的从业者兴奋不已&#xff0c;也让全世界的资本聚集在了这个领域上。 国内玩家在这个赛道也是卷了又卷。字节跳动的即梦AI&#xff0c;快手的可灵AI&#xff0c;智谱AI的CogVideoX…

Kotlin 中的 `flatMap` 方法详解

在 Kotlin 中&#xff0c;flatMap 是一个非常强大的集合操作函数&#xff0c;它结合了 map 和 flatten 的功能。flatMap 能够将一个集合中的每个元素映射为另一个集合&#xff0c;然后将这些集合连接成一个单一的集合。在很多场景下&#xff0c;它比单独使用 map 和 flatten 更…

websim.ai 体验过程+感受

体验 websim.ai 后感觉网站更倾向于客户提需求或者满足客户需求的可视化页面阶段&#xff0c;比较像设计界面。就是一直命令AI添加功能&#xff0c;然后它绘图。导出的代码是单个HTML文件&#xff0c;用前端三件套写的。 体验过程 ① Create a relationship diagram between …

四数之和--力扣18

四数之和 题目思路代码 题目 思路 类似于三数之和&#xff0c;先排序&#xff0c;利用双指针解题。 如果排序后的第一个元素大于目标值&#xff0c;直接返回&#xff0c;为什么nums[i]需要大于等于0&#xff0c;因为目标值可能为负数。比如&#xff1a;数组是[-4, -3, -2, -1…

电水壶自复位热断循环测试合规性

在家用电器安全标准中,电水壶的安全性尤为重要,尤其是涉及热保护装置的部分。电水壶在日常使用中频繁接触高温水,极端情况下,温度可能异常升高。因此,为了确保用户的安全,热保护装置必须可靠工作。本文将探讨自复位热断路器(TCO)在电水壶中的作用,以及在100次循环测试…

9.13信锐面经

1.C程序的编译过程?C头文件是怎么预处理的? 当编译器遇到#include指令时&#xff0c;它会将指定的头文件内容插入到当前源文件中。这个过程是递归的&#xff0c;即如果被包含的头文件中又有其他的#include指令&#xff0c;那么也会继续包含相应的头文件。 头文件中可能包含宏…

Nature Aging | 还在做差异分析吗?相关性+常规机器学习模型,这篇顶刊纯生信的研究思路可以说领先了一个版本!

先前给大家分享了一篇 Nature Medince 的年龄相关建模文章&#xff0c;阅读量蛮高&#xff0c;大家也都十分感兴趣。这个领域的生信研究确实会有一些特色&#xff0c;一些高分模型研究或多或少都偏向于模型的可解释性。 ▲ Nature Medicine | 常规机器学习构建蛋白质组衰老时钟…

电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会

第25届中国国际光电博览会&#xff08;“CIOE中国光博会”&#xff09;今日在深圳国际会展中心盛大开幕。本届博览会以“光电引领未来&#xff0c;驱动应用创新”为主题&#xff0c;吸引了全球超过3700家优质光电企业参展&#xff0c;展示了光电产业的最新成果和前沿技术。 电…

OAExploit一款基于OA产品的一键扫描工具

OAExploit一款基于OA产品的一键扫描工具 01 项目介绍 一款扩展性高的渗透测试框架渗透测试框架 出现卡死的几种情况&#xff1a;1.点击按钮太快 2. 打印log 的异常 02 工具展示

说真心话,在IT行业,项目经理不懂「敏捷管理」真混不下去!

根据PMI官方2015年的《职业脉搏调查》报告显示&#xff0c;高度敏捷、快速做出市场反应的组织与行动迟缓的组织相比&#xff0c;项目的成功率更高。 因此&#xff0c;在快速发展的IT行业中&#xff0c;项目经理如果能够具备快速迭代、灵活应对市场需求的“敏捷管理”思维会更吃…

--- 数据结构 优先级队列 --- java

之前提高到队列是一种先进先出的结构&#xff0c;但是在某些情况下操作的数据具有优先级&#xff0c;那么对他先进行操作&#xff0c;这时队列就不能满足需求了&#xff0c;因为队列只能操作对头的元素&#xff0c;而具有优先级的数据不一定是在对头&#xff0c;这样就需要优先…

RHCE--复习(二)之时间同步服务器

一、计时方式的发展 1.1.古代计时方式 在远古时期&#xff0c;人类用来确定时间的方式是一些自然界“相对”宜古不变的周期。如地球的公转是为一年&#xff0c;月球的公转是为一月&#xff0c;地球的自转是为一天等&#xff0c;最早的计时可以追溯到公元前大约2000年&#xff…

ESP8266+eclipse+AP+最简单webserver

实现AP模式下&#xff0c;http-server功能 在ESP8266_RTOS_SDK\ESP8266_RTOS_SDK\examples\wifi\getting_started\softAP增加webserver部分代码 1. 代码 //softap_example_main.c /* WiFi softAP ExampleThis example code is in the Public Domain (or CC0 licensed, at y…

LLaMA-Factory QuickStart

转自&#xff1a;知乎 1. 项目背景 开源大模型如LLaMA&#xff0c;Qwen&#xff0c;Baichuan等主要都是使用通用数据进行训练而来&#xff0c;其对于不同下游的使用场景和垂直领域的效果有待进一步提升&#xff0c;衍生出了微调训练相关的需求&#xff0c;包含预训练&#xf…

R1234yf汽车空调制冷剂简介

R1234yf汽车空调制冷剂是一种具有优异性能的环保型制冷剂,它被设计用于替代传统的R134a制冷剂。以下是关于R1234yf汽车空调制冷剂的详细介绍: 一、基本属性 化学名称:2,3,3,3-四氟丙烯 简称:R1234yf或HFO-1234yf 性质:无色HFO制冷剂气体 二、环保特性

2024网络安全人才实战能力白皮书安全测试评估篇

9月10日&#xff0c;国内首个聚焦“安全测试评估”的白皮书——《网络安全人才实战能力白皮书-安全测试评估篇》&#xff08;以下简称“白皮书”&#xff09;在国家网络安全宣传周正式发布。 作为《网络安全人才实战能力白皮书》的第三篇章&#xff0c;本次白皮书聚焦“安全测…

【原创】java+swing+mysql项目管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

小程序开发设计-第一个小程序:安装开发者工具③

第一个小程序&#xff1a;安装开发者工具 1.了解微信开发者工具&#xff1a; 微信开发者工具是官方推荐使用的小程序开发工具&#xff0c;它提供的主要功能如下&#xff1a; ①.快速创建小程序项目 ②.代码的查看和编辑 ③.对小程序功能进行测试 ④.小程序的预览和发布 2.下载…

swiftUI结构体数组修改属性UI没更新

SwiftUI使用了值语义&#xff0c;即当数组的值发生更改时&#xff0c;SwiftUI无法检测到具体的更改操作。 要解决这个问题&#xff0c;可以使用SwiftUI中的State属性包装器来创建一个可观察的状态变量。当数组发生更改时&#xff0c;通过更改状态变量的值来触发列表的更新,但是…