【大厂笔试】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树

检查两棵树是否相同

100. 相同的树 - 力扣(LeetCode)
image.png|540

思路解透


  1. 两个根节点一个为空一个不为空的话,这两棵树就一定不一样了
  2. 若两个跟节点都为空,则这两棵树一样
  3. 当两个节点都不为空时:
    1. 若两个根节点的值不相同,则这两棵树不一样
    2. 若两个跟节点的值相同,则对左右两棵子树进行递归判断

代码解析

/**  * 时间复杂度为:O(min(m,n))  * @param p  m个节点  * @param q  n个节点  * @return  */
public boolean isSameTree(TreeNode p, TreeNode q) {  //1. 一个为空,一个不为空,必不一样  if(p == null && q != null || p != null && q == null){  return false;  }    //2. 两个都为空  if(p == null && q == null){  return true;  }    //3. 剩下的一种情况就是两个都不为空,不需要再用if限制条件了  if(p.val != q.val){  return false;  }    //4. 此时代表两个都不为空,且 val 的值相等  //5. 说明根节点相同,系接下来判断两棵树的左右是不是同时分别相同  return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);  
}

另一棵树的子树

572. 另一棵树的子树 - 力扣(LeetCode)
image.png

思路解透


注意: 当两棵树相同时,也返回 true

  1. 首先判断两棵树是否相同,若相同,返回 true(需要调用上面一题的方法)
  2. 若不相同,判断是否是左子树的子树,是否是右子树的子树
  3. 若都不是,则返回 false

代码解析

/**  * 判断两棵树是否相同  * @param p  * @param q  * @return  */  
public boolean isSameTree(TreeNode p, TreeNode q){  if(p == null && q == null){  return true;  }    if(p != null && q == null || p == null && q != null){  return false;  }    //都不为空  if(p.val != q.val){  return false;  }    //对子树进行判断  return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);  
}  /**  * 判断是不是子树  * 时间复杂度:O(m*n)  * @param root  * @param subRoot  * @return  */  
public boolean isSubtree(TreeNode root, TreeNode subRoot) {  if(root == null){  return false;  }    //1. 两棵树若相同if(isSameTree(root,subRoot)){  return true;  }    //2. 判断是否是左子树的子树if(isSubtree(root.left,subRoot)){  return true;  }    //3. 判断是否是右子树的子树if(isSubtree(root.right,subRoot)){  return true;  }    return false;  
}

翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode)
image.png|461

思路解透


  1. 若跟节点为空就返回 null
  2. (优化步骤)若左右两边都为空,就不需要交换了,直接返回 root
  3. 定义一个 ret 节点作为中间人,将左右子节点进行交换
  4. 递归对左右子节点的左右子节点进行交换
  5. 返回 root

代码解析

/**  * 翻转二叉树  * @param root  * @return  */  
public TreeNode invertTree(TreeNode root) {  if(root == null) {  return null;  }    if(root.left == null && root.right == null){  return root;  }    //左右子节点进行交换TreeNode ret = root.right;  root.right = root.left;  root.left = ret;  invertTree(root.left);  invertTree(root.right);  return root;  
}

二叉树最大深度

104. 二叉树的最大深度 - 力扣(LeetCode)
image.png|407

思路解透


树的高度 = { 左树高度,右树高度 } m a x + 1 树的高度 = {\{左树高度,右树高度\}}_{max}+1 树的高度={左树高度,右树高度}max+1
root 下来之后,每次都是取左右两边更高的那一个,再+1 递归上去
image.png|369

代码解析

//获取二叉树的高度  
public int maxDepth(TreeNode root) {  if(root == null){  return 0;  }    int leftDepth = maxDepth(root.left);  int rightDepth = maxDepth(root.right);  return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;  
}

平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)
image.png|646

思路解透

平衡二叉树:
所有节点的左右子树高度差小于等于 1

  1. 当前 root 的左右子树高度差小于等于 1
    • 用到 Math.abs() 方法,得到的是() 里面的绝对值
  2. 同时满足 root 的左子树平衡 && root 的右子树平衡

代码解析

/**  * 获取最大深度  * @param root  * @return  */  
public int maxDepth(TreeNode root) {  if(root == null){  return 0;  }    int leftDepth = maxDepth(root.left);  int rightDepth = maxDepth(root.right);  return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;  
}  /**  * 平衡二叉树  * 时间复杂度为:O(n^2)* @param root  * @return  */  
public boolean isBalanced(TreeNode root) {  if(root == null){  return true;  }   int leftDepth = maxDepth(root.left);  int rightDepth = maxDepth(root.right);  if(Math.abs(leftDepth - rightDepth) <= 1 &&  isBalanced(root.left) && isBalanced(root.right)){  return true;  }    return false;  
}

代码优化(字节笔试)

在时间复杂度为 O(n) 的条件下,完成平衡二叉树的判断

若要让时间复杂度为O(n),则需要在判断的过程中,只要发现左右俩树高度相差大于 1,就直接 return -1,不再进行后续判断了

/**  * 获取最大深度  * @param root  * @return  */  
public int maxDepth(TreeNode root) {  if(root == null){  return 0;  }    int leftDepth = maxDepth(root.left);  if(leftDepth < 0)return -1;int rightDepth = maxDepth(root.right);  if(rightDepth < 0)return -1;if(Math.abs(leftDepth - rightDepth) <= 1){return Math.max(leftDepth, rightDepth);  }else {return -1;}
}  /**  * 平衡二叉树  * 时间复杂度为:O(n^2)* @param root  * @return  */  
public boolean isBalanced(TreeNode root) {  if(root == null){  return true;  }   return maxDepth(root) >= 1;  
}

对称二叉树

101. 对称二叉树 - 力扣(LeetCode)
image.png

思路解透

需要判断 root 左树和右树是否对称

  • p 的左树和 q 的右树是否对称
  • p 的右树和 q 的左树是否对称
  1. 结构
    1. 一个为空,一个不为空
    2. 两个都为空
    3. 两个都不为空
  2. 值:建立在两个引用都不为空的情况下,判断 val

代码解析

public boolean isSymmetric(TreeNode root) {  if (root == null) return true;  return isSymmetricChild(root.left, root.right);  
}  public boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree) {  //1. 检查结构是否相同  //1.1 一个为空一个不为空  if (leftTree != null && rightTree == null || leftTree == null && rightTree != null) {  return false;  }    //1.2 处理两个都为空和两个都不空的情况  if (leftTree == null && rightTree == null) {  return true;  }    //1.3 两个都不为空,判断他们的值一不一样  if (leftTree.val != rightTree.val) {  return false;  }    //此时两个节点都不为空,且值一样  //2. 开始判断是否对称,需要满足  // 左子树的左 和 右子树的右对称 通同时 左子树的右 和 右子树的左对称  return isSymmetricChild(leftTree.left, rightTree.right) && isSymmetricChild(leftTree.right, rightTree.left);  
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】了解哈希表,解决哈希冲突,用Java模拟实现哈希桶

哈希表的概念 哈希表&#xff08;Hash Table&#xff09;是一种高效的数据结构&#xff0c;用于实现快速的数据存储和检索。它通过将数据映射到一个数组的索引位置&#xff0c;从而能够在平均情况下实现O(1)的时间复杂度进行查找、插入和删除操作。 哈希表的基本概念包括以下…

java面向对象重点总结

文章目录 java面向对象重点总结类与实例构造方法方法重载属性与修饰符封装继承多态重构抽象类接口抽象类和接口的区别&#xff1a;集合泛型 java面向对象重点总结 对象是一个自包含的实体&#xff0c;用一组可识别的特性和行为来标识。 面向对象编程&#xff0c;英文叫Object…

flink 1.17 测试

1、配置 2、测试&#xff1a; ./bin/flink run-application -t yarn-application -Dyarn.application.namewordcount -c org.apache.flink.streaming.examples.wordcount.WordCount ./examples/streaming/WordCount.jar --input hdfs://jy/tmp/input --output hdfs://jy/tmp/o…

C++学习:C++是如何运行的

C 是一种强类型的编程语言&#xff0c;支持面向对象、泛型和低级内存操作。它的工作机制包括从编写源代码到生成可执行文件的一系列步骤。C与文件无关&#xff0c;文件只是容纳运行内容的载体&#xff0c;需要对文件以目标系统的规则编译后&#xff0c;才能在目标系统中运行。 …

java算法递归算法练习-数组之和

简单找个题目练习一下递归算法&#xff0c;输入一组数组&#xff0c;使用递归的方法计算数组之和。其实这个题目&#xff0c;用循环的方式也很简单就能解决&#xff0c;直接循环遍历一下相加就行了&#xff0c;但是我们用来练习一下递归。 先来找基线条件和递归条件 基线条件…

springboot+webSocket对接chatgpt

webSocket对接参考 话不多说直接上代码 WebSocket package com.student.config;import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springfram…

matplotLib在图中标出最后一个点的值

import matplotlib.pyplot as plt import numpy as np# 生成100个随机数据 data np.random.rand(100)# 绘制数据 plt.plot(data, labelData Points)# 获取最后一个数据点的位置和值 last_x len(data) - 1 last_y data[-1]# 用红圈标出最后一个点 plt.plot(last_x, last_y, r…

STM32-寄存器DMA配置指南

配置步骤 在STM32F0xx中文参考手册中的DMA部分在开头给出了配置步骤 每个通道都可以在外设寄存器固定地址和存储器地址之间执行 DMA 传输。DMA 传输的数据 量是可编程的&#xff0c;最大达到 65535。每次传输之后相应的计数寄存器都做一次递减操作&#xff0c;直到 计数为&am…

jdk环境、tomcat环境

回顾复习 安装nodejs&#xff0c;和jdk一样的软件运行环境 yum -y list installed|grep epel #是否安装epel yum -y install nodejs node -v #查看版本号 下载对应的nodejs软件npm yum -y install npm npm -v #查 npm set config ....淘宝镜像 安装vue/cli…

[ACTF2020 新生赛]BackupFile1

打开题目 利用disearch扫描&#xff0c;发现源文件index.php.bak 下载下来 打开文件 代码审计&#xff0c;翻译一下 翻译代码为&#xff1a; <?php include_once "flag.php"; //这一行使用 include_once 函数来包含&#xff08;或插入&#xff09;另一个 PHP …

Win11系统文件资源管理器鼠标右键卡顿解决方法

引用链接&#xff1a; Windows 11文件资源管理器崩溃怎么解决&#xff1f;看看这7个解决办法&#xff01;

Redis的集群 高可用

文章目录 Redis基本概念主从复制哨兵模式故障切换集群 Redis基本概念 Redis集群三种模式 主从复制&#xff1a;奇数台 3&#xff1a; 一主两从 哨兵模式&#xff1a;3&#xff1a; 1主两从 cluster&#xff1a;6 主从复制&#xff1a;和mysql的主从复制类似&#xff0c;主…

C++ string类

目录 为什么要有string类&#xff1f; auto和范围for 1. auto 2. 范围for 一. 标准库中string类的简单使用 二. string类的常用接口说明 1. string类对象的常见构造 2. string类对象的容量操作 3. string类对象的访问及遍历操作 4. string类对象的修改与查找操作 插入…

【Web 前端开发】vue3开发环境部署

1、安装 Node.js 和 npm 访问 Node.js 官网 下载并安装最新的 LTS 版本。 安装完成后&#xff0c;打开命令行工具&#xff0c; 输入 node -v 和 npm -v 检查安装是否成功。 node -vnpm -v 如下图&#xff1a; 2、安装 Vue CLI 在命令行工具中输入以下命令安装 Vue CLI&…

微信小程序开发:宿主环境—组件

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

详解DDR3原理以及使用Xilinx MIG IP核(app 接口)实现DDR3读写测试

系列文章目录 &#xff08;1&#xff09;详解SDRAM基本原理以及FPGA实现读写控制 文章目录 系列文章目录一、DDR简介1.1 什么是 SDRAM、DDR、DDR2、DDR31.2 SDRAM、DDR、DDR2、DDR3核心频率、工作频率以及等效频率的计算1.3 DDR3带宽以及容量的计算 二、MIG IP核的介绍三、MIG…

机器学习 第8章-集成学习

机器学习 第8章-集成学习 8.1 个体与集成 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类器系统(multi-classifersystem)、基于委员会的学习(committee-based learning)等。 图8.1显示出集成学习的一般结构:先产生一组“…

【附安装包】CentOS7(Linux)详细安装教程(手把手图文详解版)

目前流行的虚拟机软件有VMware、Virtual Box和Virtual PC等等&#xff0c;其中最常用的就是VMware。 而centos是Linux使用最广泛的版本之一。 教程开始教程有许多不完备之处&#xff0c;大佬请忽略。。。 1.安装VMware 首先需要准备VMware的安装包以及Ubuntu的ISO镜像&#…

鸿蒙系统开发【设备安全服务-应用设备状态检测】安全

设备安全服务-应用设备状态检测 介绍 本示例向您介绍如何在应用中获取DeviceToken用于对应用的设备状态进行检测。 需要使用设备安全服务接口 kit.DeviceSecurityKit。 效果预览 Sample工程的配置与使用 在DevEco中配置Sample工程的步骤如下 [创建项目]及[应用]。打开Sam…

数据结构与算法 - 递归

一、递归 1. 概述 定义&#xff1a;在计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集。 比如单链表递归遍历的例子&#xff1a; void f(Node node) {if(node null) {return;}println("before:" node…