Collection与数据结构 二叉树(二):二叉树精选OJ例题(上)

news2024/12/26 11:14:48

1. 判断是否为相同的二叉树

OJ链接
在这里插入图片描述

public boolean isSameTree(Node p, Node q) {
        if (p == null && q != null || p != null && q == null){//结构不同
            return false;
        }
        if (p == null && q == null){//结构相同,都是空树
            return true;
        }
        if (p.value != q.value){//结构相同,不是空树,但是值不一样
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);//向下递归
    }

整体思路:
首先判断结构是否相同,一种是不同,这种直接返回false,另一种是相同,一种是都为空,这种直接返回true,一种是都不为空相同,那么进行下一步,判断值是否相同,相同向下递归,不相同返回false.
在这里插入图片描述

2. 判断是否为子树

OJ链接
在这里插入图片描述

public boolean isSubtree(Node root, Node 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 boolean isSameTree(Node p, Node q) {
        if (p == null && q != null || p != null && q == null){//结构不同
            return false;
        }
        if (p == null && q == null){//结构相同,都是空树
            return true;
        }
        if (p.value != q.value){//结构相同,不是空树,但是值不一样
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);//向下递归
    }

整体思路:
首先判断根结点是否为空,如果为空,返回false,之后从根节点判断两棵树是否是相同的树,如果是,返回true,如果不是,则向左子树和右子树递归,判断左子树和右子树是否和所给的树相同.
在这里插入图片描述

3. 翻转二叉树

OJ链接
在这里插入图片描述

public Node invertTree(Node root) {
        if (root == null){
            return null;//空树返回null
        }
        Node tmp = null;
        tmp = root.left;
        root.left = root.right;
        root.right = tmp;//交换左结点和右结点
        invertTree(root.left);
        invertTree(root.right);//向下递归
        return root;//返回根节点
    }

这里需要注意的一点就是需要引入第三个结点来交换两个结点的位置.只要想到这一点,问题便不是很大.

4. 判断是否是平衡二叉树

该题为字节跳动面试真题
OJ链接
在这里插入图片描述

  1. 普通解法
public boolean isBalanced(Node root) {
        if(root == null){//空树返回true
            return true;
        }
        int hightleft = getHeight(root.left);
        int hightright = getHeight(root.right);//获取两棵树的高度,这里设置两棵树的高度是有必要的
        //如果不保存这里的值,后面会又很多重复获取高度的操作,效率会大大降低
        if(Math.abs(hightleft-hightright)<2 && isBalanced(root.left)
                && isBalanced(root.right)){//根结点所在的树和以左子树右子树为根节点的树都符合条件
            return true;
        }else{
            return false;
        }
    }
public int getHeight(Node root) {
        if (root == null){
            return 0;
        }
        return Math.max(getHeight(root.left),getHeight(root.right))+1;
    }

递归思路如图:
在这里插入图片描述

在图中我们可以看到在从根节点递归到作左树的根结点的时候,就已经遇到了不平衡,但是在传入左树的根节点的时候,还是要向下递归,这种做法就使得每一个结点都要向下递归,时间复杂度达到了O(n2),这样就是多此一举的做法,我们希望遇到不平衡就不再向下递归,这种做法是面试官青睐的做法.

public int getHeight2(Node root){
        if (root == null){
            return 0;//结点为空返回0
        }
        int leftHeight = getHeight2(root.left);
        int rightHeight = getHeight2(root.right);//获取高度
        if (leftHeight>=0 && rightHeight >=0 && Math.abs(leftHeight-rightHeight)<2 ){
            return Math.max(leftHeight,rightHeight)+1;//返回的值不是-1或者是左右树高度差小于2,返回可以获取的高度
        }else{
            return -1;//否者返回-1
        }
    }
    public boolean isBalanced2(Node root) {
        if(root == null){
            return true;
        }
        return getHeight(root)>=0;//看root的返回值是否为负数,返回值不为负数,说明平衡,否则不平衡
    }

递归思路:
在这里插入图片描述
这样的做法就是比较高效的,在从根节点向下递归的时候,如果一旦遇到了不平衡,立即返回-1,对应条件是Math.abs(leftHeight-rightHeight)<2,一旦有一个结点返回了-1,之后的每一个结点在返回的时候均返回-1,对应的是leftHeight>=0 && rightHeight >=0.在最后只需要判断root结点拿到的值是否是-1即可.

5. 判断是否是对称二叉树

OJ链接
在这里插入图片描述

public boolean isSymmetric(Node root) {
        if (root == null){
            return true;//为空返回true
        }
        return isSymmetricChild(root.left,root.right);//根节点无需判断,则判断子树是否对称
    }

public boolean isSymmetricChild(Node left,Node right){
    if (left == null && right == null){
        return true;//结构相同,两个都为空,返回true
    }
    if (left != null && right == null || left == null && right != null){
        return false;//结构不同,返回false
    }
    if (left.value != right.value){
        return false;//结构相同,值不一样,返回false
    }
    return isSymmetricChild(left.left,right.right) && isSymmetricChild(left.right,right.left);
    //向下递归,判断左树的左和右树的右,左树的右和右树的左是否相同,不相同返回false
}

整体思路:
如果这棵树为null,则符合对称树的条件,返回true,之后递归到左右子树,判断左右子树的根节点是否相同(这里判断根结点是否相同的思路和判断两棵树是否是同一棵树的思路相同),如果不同,则返回false,如果相同,则递归左子树的左,右子树的右;左子树的右和右子树的左即可(判断它们是否相同).
在这里插入图片描述

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

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

相关文章

STC89C52学习笔记(十二)

STC89C52学习笔记&#xff08;十二&#xff09; 一、AD/DA 1.定义 AD能够将模拟信号转化为数字信号&#xff0c;DA能够将数字信号转化为模拟信号。 2.两种类型的DA转换器 &#xff08;1&#xff09;PWM型DA滤波器 由于PWM是通过脉冲调制的方法来调整的&#xff0c;低通滤…

【数字IC/FPGA】什么是无符号数?什么是有符号数?

进制 虽然在日常生活中&#xff0c;我们已经习惯了使用10进制数字&#xff0c;但在由数字电路构成的数字世界中&#xff0c;2进制才是效率更高的选择。 10进制与2进制 10进制&#xff08;decimal&#xff09;计数法&#xff08;一般也叫阿拉伯计数法&#xff09;是在日常生活…

C++ | Leetcode C++题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummy new ListNode(0, head);ListNode* first head;ListNode* second dummy;for (int i 0; i < n; i) {first first->next;}while (fi…

UE4_导入内容_骨架网格体

FBX 导入支持 骨架网格体&#xff08;Skeletal Mesh&#xff09; 。这提供了一种简化的处理流程来将有动画的网格体从 3D应用程序中导入到虚幻引擎内&#xff0c;以便在游戏中使用。除了导入网格体外&#xff0c;如果需要&#xff0c;动画和变形目标都可以使用FBX格式 在同一文…

IDA导入jni.h头文件步骤

源地址&#xff1a;https://www.ctvol.com/asreverse/2273.html 导入步骤1&#xff1a; 点击IDA Pro 菜单项“File->Load file->Parse C header file ” 选择jni.h头文件。 导入步骤2&#xff1a; 1、点击IDA Pro 主界面上的“Structures”选项卡。 2、按下Insert键…

为什么会有c++内存模型

1. 引言 c的内存模型主要解决的问题是多线程的问题。怎么理解多线程呢&#xff1f;单核时候&#xff0c;只有1个CPU内核处理多线程&#xff0c;各线程之间随着时间的推进&#xff0c;会不断的切换&#xff0c;如下图形便于理解。 实际上线程间的切换是非常快的&#xff0c;所以…

OpenHarmony实战开发-异步并发概述 (Promise和async/await)。

Promise和async/await提供异步并发能力&#xff0c;是标准的JS异步语法。异步代码会被挂起并在之后继续执行&#xff0c;同一时间只有一段代码执行&#xff0c;适用于单次I/O任务的场景开发&#xff0c;例如一次网络请求、一次文件读写等操作。 异步语法是一种编程语言的特性&…

信息系统项目管理师——管理类计算

风险管理——风险曝光度 风险曝光度概率*影响&#xff0c;概率指风险发生的概率&#xff0c;影响指风险一旦发生&#xff0c;受到影响的项。 题号【GX20061101](61) 知识点[风险曝光度] 风险的成本估算完成后&#xff0c;可以针对风险表中每个风险计算其风险曝光度。某软件小…

h5 笔记4 表格与表单

<table></table>设置表格&#xff1b; <tr></tr>设置行数&#xff1b; <td></td>设置列数&#xff1b; <caption></caption>设置表格标题&#xff1b; <th></th>设置列标题。 直列&#xff1a;column&#xf…

LeetCode 678——有效的括号字符串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 需要两个栈&#xff0c;一个用来保存左括号所在的位置索引&#xff0c;一个用来保存星号所在的位置索引。 从左往右遍历字符串&#xff0c;如果是左括号或者星号&#xff0c;则将位置索引分别入栈&#xff0c;如…

【网站项目】面向企事业单位的项目申报小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

精通技术写作:如何写出高质量技术文章?

CSDN 的朋友你们好&#xff0c;我是未来&#xff0c;今天给大家带来专栏【程序员博主教程&#xff08;完全指南&#xff09;】的第 7 篇文章“如何撰写高质量技术文章”。本文深入探讨了如何写好一篇技术文章。文章给出了好的技术文章的定义和分析&#xff0c;并提供了从选题、…

02 MySQL 之 DQL专题

3. 数据库中仅有月薪字段&#xff08;month_salary&#xff09;&#xff0c;要求查询所有员工的年薪&#xff0c;并以年薪(year_salary)输出&#xff1a; 分析&#xff1a; 查询操作中&#xff0c;字段可以参与数学运算as 起别名&#xff0c;但实际上可以省略 #以下两句效果…

202209青少年软件编程(scratch图形化) 等级考试试卷(四级)

第1题&#xff1a;【 单选题】 运行下列程序&#xff0c;说法正确的是&#xff1f;&#xff08;&#xff09; A:列表中的数字全部小于11 B:列表的长度为 10 C:变量i最终值为 20 D:列表中有大于 10 的数字 【正确答案】: D 【试题解析】 : 程序运行后&#xff0c;变量i最…

SSRF+Redis未授权getshell

SSRFRedis未授权getshell 1.前言 当一个网站具有ssrf漏洞&#xff0c;如果没有一些过滤措施&#xff0c;比如没过滤file协议&#xff0c;gophere协议&#xff0c;dict等协议&#xff0c;就会导致无法访问的内网服务器信息泄露&#xff0c;甚至可以让攻击者拿下内网服务器权限 …

Hadoop 3.1.3

第1章 Hadoop概述 1.1 Hadoop是什么 1.2 Hadoop发展历史&#xff08;了解&#xff09; 1.3 Hadoop三大发行版本&#xff08;了解&#xff09; Hadoop三大发行版本&#xff1a;Apache、Cloudera、Hortonworks。 Apache版本最原始&#xff08;最基础&#xff09;的版本&#x…

【学习笔记十一】EWM上架目标仓位确定过程及配置

一、EWM确定目标区域概述 1.EWM从仓库处理类型获取源仓库类型&#xff08;Source storage type&#xff09;和源仓位&#xff08;Source Bin&#xff09;2.EWM根据仓库类型&#xff08;storage type&#xff09;、仓库分区&#xff08;storage section&#xff09;和上架策略&a…

待研究技术

Fabric.js H5 Canvas的js库 Fabric.js是一个用于创建交互式的HTML5 Canvas应用程序的JavaScript库。它提供了一个简单而强大的API&#xff0c;用于在Web浏览器中绘制和操作图形对象。Fabric.js可以用于创建各种图形应用程序&#xff0c;例如绘图编辑器、图像编辑器、流程图、地…

做产品,我的转行+转岗经历

许多小伙伴在后台留言提到数据产品经理这个岗位&#xff0c;今天来给大家介绍一下数据产品的一些基本工作内容和流程&#xff0c;帮助大家了解。 之前写了一篇转行PM的历程文章&#xff0c;有很多像我当年一样在求职中的小伙伴私信我&#xff0c;这其中有应届生也有程序员&…

基于Springboot+Vue的Java项目-房产销售系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…