当前位置: 首页 > news >正文

数据结构在二叉树Oj中利用子问题思路来解决问题

二叉树Oj题

  • 获取二叉树的节点数
  • 获取二叉树的终端节点个数
  • 获取k层节点的个数
  • 获取二叉树的高度
  • 检测为value的元素是否存在
  • 判断两颗树是否相同
  • 判断是否是另一棵的子树
  • 反转二叉树
  • 判断一颗二叉树是否是平衡二叉树
    • 时间复杂度O(n*n)
    • 复杂度O(N)
  • 二叉树的遍历
  • 判断是否是对称的二叉树
  • 二叉树的层序遍历

获取二叉树的节点数

首先从左树开始递到最下一层,当最后一层H没有节点时,归回+1以此类推,最终返回的节点就是我们树的节点树。
在这里插入图片描述

public int getNodeCount(TreeNode root){if(root==null)return 0;return getNodeCount(root.left)+getNodeCount(root.right)+1;}

获取二叉树的终端节点个数

首先清楚二叉树的终端结点是什么?
终端结点说明它的度为0(没有子树),所以左树和右树的值为null,而我们就只需要判断一下,如果左树和右树值为null,则就是一个叶子结点+1.
在这里插入图片描述

 public int getLeafCount(TreeNode root){if(root==null)return 0;if(root.left==null&&root.right==null){return 1;}return getLeafCount(root.left)+getLeafCount(root.right);}

获取k层节点的个数

第一层为我们的根节点,它的个数一定是1,而根的左树和右树则为2,以此类推
在这里插入图片描述
首先我们的第一个条件是k为1时一定会有一个节点数
这里当我们递出去时,我们就会减少一层当k等于1时,这里我们就在k层找到一个节点然后回归到父节点然后继续子树找下一个节点,知道将k层的节点数遍历完。
在这里插入图片描述

  public int getLevelCount(TreeNode root,int k){if(root==null)return 0;if(k==1)return 1;return getLevelCount(root.left,k-1)+getLevelCount(root.right,k-1);}

获取二叉树的高度

这里直接求左子树的最大高度和右子树的最大高度然后进行比较,然后返回最大的高度值就可以
在这里插入图片描述

在这里插入图片描述

  public int getBinaryTreeHeight(TreeNode root){if(root==null)return 0;int maxtLeftHeight=getBinaryTreeHeight(root.left);int maxRightHeight=getBinaryTreeHeight(root.right);return maxLeftHeight>maxRightHeight?maxLeftHeight+1:maxRightHeight+1;}

检测为value的元素是否存在

首先root根和递归的条件不能为空
然后判断root的值是否为value值并返回这个值
用一个ret来接收其返回值,然后判断ret不为空,则回来的值将root的value值带回
(ret如果为空,说明root根或者递归的条件就是空的,没有要找的元素)
在这里插入图片描述

public TreeNode find(TreeNode root,String val){if(root==null)return null;if(root.val.equals(val))   return root;TreeNode ret1 =  find(root.left,val);if(ret1!=null)return ret1;TreeNode ret2 =  find(root.right,val);if(ret2!=null)return ret2;return null;}

判断两颗树是否相同

判断两颗树是否相同
首先根节点到叶子结点两者的结构相同
然后是根节点到叶子结点的值要相同
如果说一棵树为空但是另一个树不为空,说明两棵树的结构一定是不同的
如果两颗树都为空,加上上述说明两棵树的结构一致
接下来判断节点的值
两颗树的节点值如果不一样,则也不是相同的
最后判断两颗树左树和右树是否一致
两棵树

   public boolean isSameTree(TreeNode tree1,TreeNode tree2){//两棵树如果同时走一个有节点一个没有节点一定不相同if(tree1==null&&tree2!=null||tree1!=null&&tree2==null)return false;//两棵树都为null说明都没有可以走的节点if(tree1==null&&tree2==null)return true;//判断结构//判断节点值是否相同不同为falseif(!tree1.val.equals(tree2.val)return false;return isSameTree(tree1.left,tree2.left)&&isSameTree(tree1.right,tree2.right);}

判断是否是另一棵的子树

判断是否是tree中的一颗子树,subtree一定是t在ree中头节点左子树中或者是右子树中,如果不在这里直接返回false
这里由tree的左子树和右子树递归找到subtree的根节点,找到后将tree中的subtree子树与subtree同时遍历来确认是否为一个相同的树。

在这里插入图片描述

 public boolean isSubtree(TreeNode root, TreeNode subRoot) {//是相同的树节点返回trueif(isSameTree(root,subRoot))return true;//递归如果出现root为null时,因为没有语句拦截,root会继续往下走导致空指针异常//subRoot为null直接返回false,主树不在进行下面的递归if(root==null||subRoot==null)return false;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 tmp=root.left;root.left=root.right;root.right=tmp;invertTree(root.left);invertTree(root.right);return root;}

判断一颗二叉树是否是平衡二叉树

时间复杂度O(n*n)

该题判断二叉树是否是平衡二叉树的条件是:左子树与右子树的绝对值一定小于或者等于1,如果高度大于1则非平衡二叉树。
如果根节点只有一个节点或者他的左右子树差的绝对值为0,则为平衡二叉树
在这里插入图片描述
只判断了根的节点的话它的左右子树的差确实为1,但是左子树中b的左子树和右子树的差值为2,这也不是一个平衡的二叉树。
在这里插入图片描述

  public boolean isBalanced(TreeNode root) {if(root==null)return true;//root为null直接返回为空int leftHeight = maxDepth(root.left);//求左树的高度int rightHeight = maxDepth(root.right);//求右树的高度return Math.abs(leftHeight-rightHeight)<=1//判断&&isBalanced(root.left)&&isBalanced(root.right);}public int maxDepth(TreeNode root){//求二叉树的最大深度if(root==null)return 0;int leftHeight=maxDepth(root.left);int rightHeight=maxDepth(root.right);return leftHeight>rightHeight?leftHeight+1:rightHeight+1;}

复杂度O(N)

我们如果
这里如果我们在找左右子树高度的差值时如果发现了它差值大于1的情况,我们直接返回-1,当最后回归到根节点左右子树时,差值也大于1

class Solution {public boolean isBalanced(TreeNode root) {if(root==null)return true;int ret =maxDepth(root);//接收ret为-1则左右子树差值一定大于1if(ret==-1){return false;}return true;}public int maxDepth(TreeNode root){//求二叉树的最大深度if(root==null)return 0;int leftHeight=maxDepth(root.left);int rightHeight=maxDepth(root.right);//走到这里最靠下的边上的左右子树求得高度if(leftHeight>=0&&rightHeight>=0&&Math.abs(leftHeight-rightHeight)<=1){//说明左右子树的绝对值为<=1并且大于等于0//返回左右子树中最大的一个高度+1return Math.max(leftHeight,rightHeight)+1;}else{return -1;}}
}

二叉树的遍历

在这里插入图片描述
首先创建一个类来实现构造二叉树的前提
因为题目条件给定的是输入一串字符串然后先序遍历这个字符串来建立起二叉树,然后通过中序遍历在进行打印
在这里插入图片描述

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 void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNextLine()) {String str=in.nextLine();TreeNode root=createTree(str);inOrder(root);}}public static TreeNode createTree(String str) {TreeNode root=null;//遍历字符串str来获取字符来给到root,因为不确定root是不是空节点。if (str.charAt(i) != '#') {root =new TreeNode(str.charAt(i));i++;//通过i++来递归左右树root.left=createTree(str);root.right=createTree(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);}

判断是否是对称的二叉树

二叉树反转过来的镜像就是对称的二叉树
这里直接从根节点的左树和右树下手
满足条件1:二叉树的结构相同
满足条件2:二叉树的对称值相同
左子树中的左树对应右子树的右树
右子树的左树对应左子树的右树

在这里插入图片描述

    public boolean isSymmetric(TreeNode root) {if(root==null)return true;//判断左右节点是否对称return isSymmetricChild(root.left,root.right);}public boolean isSymmetricChild(TreeNode t1,TreeNode t2){//这里t1和t2的结构不相同if(t1==null&&t2!=null||t1!=null&&t2==null)return false;//两者都为空,说明结构相同走向空节点if(t1==null&&t2==null)return true;//到这里结构相同检查对称值if(t1.val!=t2.val)return false;//满足左右子树的对称条件 return isSymmetricChild(t1.left,t2.right)&&isSymmetricChild(t1.right,t2.left);}

二叉树的层序遍历

二叉树层序遍历是地1层开始从左到右,从上到下开始遍历。
如果用二维数组来进行层序遍历怎么做呢?
这里需要用到队列,因为第一层的根节点永远是1,我们将它放入到队列中来遍历这个队列

如果a释放完且a树的值给到了一维数组后,会得到b和c两个子树并放到队列中,这时候需要一个计数器来计算当前的层数,当层数为0时,我们将一维数组所有的值放到二维数组中就好了
在这里插入图片描述

public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> line=new ArrayList<List<Integer>>();if(root==null)return line;Queue<TreeNode> queue=new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){int size=queue.size();List<Integer> col=new ArrayList<Integer>();while(size!=0){TreeNode cur = queue.poll();col.add(cur.val);size--;if(cur.left!=null) queue.offer(cur.left);if(cur.right!=null) queue.offer(cur.right);}line.add(col);}return line;}

相关文章:

数据结构在二叉树Oj中利用子问题思路来解决问题

二叉树Oj题 获取二叉树的节点数获取二叉树的终端节点个数获取k层节点的个数获取二叉树的高度检测为value的元素是否存在判断两颗树是否相同判断是否是另一棵的子树反转二叉树判断一颗二叉树是否是平衡二叉树时间复杂度O(n*n)复杂度O(N) 二叉树的遍历判断是否是对称的二叉树二叉…...

华为openEuler考试真题演练(附答案)

【单选题】 以下关于互联网的描述&#xff0c;哪个选项是正确的? A:Nginx 在万维网中可以作为 ftp 服务器的反向代理&#xff0c;并与ftp服务器的数量--对应 B:Nginx 在互联网中可以作为 web服务器端&#xff0c;成为万维网的一个节点 C:互联网上的的资源需使用 Nginx进行七层…...

生成自签名证书并配置 HTTPS 使用自签名证书

生成自签名证书 1. 运行 OpenSSL 命令生成证书和私钥 在终端中输入以下命令&#xff0c;生成自签名证书和私钥文件&#xff1a; sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout self_signed.key -out self_signed.pem-x509&#xff1a;生成自签名证书。…...

物联网核心安全系列——智能汽车安全防护的重要性

汽车行业引入的智能硬件技术已经越来越多&#xff0c;早先设计者更多考虑到的是硬件成本和软件用户体验等因素&#xff0c;但随着国外两位技术人员成功实现远程控制汽车的视频曝出后&#xff0c;智能汽车安全便成为了一个热议话题。 汽车总线架构及原理比较复杂&#xff0c;日…...

数据库视图

数据库视图&#xff08;Database View&#xff09;是数据库中的虚拟表&#xff0c;其内容由查询定义&#xff0c;通常用来简化复杂的查询或提供安全访问数据。视图并不存储实际数据&#xff0c;而是将查询的结果集作为一个“虚拟表”呈现。用户通过查询视图&#xff0c;就可以看…...

从传统分析到智能问数,打造零门槛数据分析方案

众所周知&#xff0c;传统报表和自助分析工具存在使用门槛&#xff0c;且早期智能分析不够智能。随着AI技术发展&#xff0c;现有数据应用模式难以满足多样化、快速变化的需求&#xff0c;数据驱动、敏捷决策、精细运营成为了各大企业的新课题。 01企业数据应用挑战 业务人员的…...

java 设计模式 模板方法模式

模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它在父类中定义一个算法的框架&#xff0c;允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式非常适合于那些有一定公共流程&#xff0c;但某些步骤需要子类定制…...

基于UDP和TCP实现回显服务器

目录 一. UDP 回显服务器 1. UDP Echo Server 2. UDP Echo Client 二. TCP 回显服务器 1. TCP Echo Server 2. TCP Echo Client 回显服务器 (Echo Server) 就是客户端发送什么样的请求, 服务器就返回什么样的响应, 没有任何的计算和处理逻辑. 一. UDP 回显服务器 1. UD…...

在 CentOS 系统上直接安装 MongoDB 4.0.25

文章目录 步骤 1&#xff1a;配置 MongoDB 官方源步骤 2&#xff1a;安装 MongoDB步骤 3&#xff1a;启动 MongoDB 服务步骤 4&#xff1a;验证安装步骤 5&#xff1a;可选配置注意事项 以下是在 CentOS 系统上直接安装 MongoDB 4.0.25 的详细步骤&#xff1a; 步骤 1&#x…...

Android和IOS的区别

一、系统区别 1、系统和框架的区别 &#xff08;1&#xff09;Android系统的底层建立在Linux系统之上&#xff1b;而ios基于UNIX系统 Android完全开放&#xff0c;iOS完全封源开发 &#xff08;2&#xff09;编程语言:Android的编程语言是Java和KotLin&#xff1b;而ios的则为O…...

数据库基础(MySQL)

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a; 磁盘内存 为…...

Vue前端开发子组件向父组件传参

在父组件中&#xff0c;如果需要获取子组件中的数据&#xff0c;有两种方式&#xff0c;一种是在子组件中自定义事件&#xff0c;父组件绑定该事件&#xff0c;当触发自定义事件时&#xff0c;向父组件传入参数;另一种是先通过ref属性给子组件命名&#xff0c;然后在父组件中就…...

javaScript语法基础(函数,对象,常用类Array,String,Math和Date)

# 本文详细结束了JavaScript中函数、对象、常用类Array&#xff0c;String&#xff0c;Math和Date的用法。 一、函数 1、概述 将程序中多次要用到的代码块封装起来&#xff0c;就是函数。函数使代码块的重复使用更方便&#xff0c;且功能独立&#xff0c;便于维护。 2、函数的…...

WebStorm 2022.3.2/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理

WebStorm 2022.3.2/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理 1. 标题识别elementUI组件爆红 这个原因是&#xff1a; 在官网说明里&#xff0c;才版本2024.1开始&#xff0c;默认启用的 Vue Language Server&#xff0c;但是在 Vue 2 项…...

k8s-NetworkPolicy

NetworkPolicy 是k8s中的网络策略可以限制pod以及namespace之间的访问流量 演示一下名称空间之间基于端口的访问限制 官方对networkpolicy的介绍 官方网址&#xff1a; 网络策略 |Kubernetes &#xff08;简体中文&#xff09; 一&#xff1a;创建NetworkPolicy vim…...

【C++】踏上C++学习之旅(九):深入“类和对象“世界,掌握编程的黄金法则(四)(包含四大默认成员函数的练习以及const对象)

文章目录 前言1. 实现Date类的构造函数2. 实现Date类的拷贝构造函数3. 实现Date类的赋值运算符重载4. 实现各Date对象之间的比较接口5. 实现Date对象的加减接口6. const成员7. 取地址及const取地址操作符重载 前言 在我们前面学习到了"类和对象"的四大默认成员函数(…...

C++——智能指针剖析

参考&#xff1a; 恋恋风辰官方博客 动态内存管理 - cppreference.com SRombauts/shared_ptr&#xff1a; 一个最小的 shared/unique_ptr 实现&#xff0c;用于处理 boost/std&#xff1a;&#xff1a;shared/unique_ptr 不可用的情况。 C智能指针_c 智能指针-CSDN博客 当…...

241119.LeetCode——383.赎金信

题目描述 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输…...

基于SSM的农家乐管理系统+论文示例参考

1.项目介绍 功能模块&#xff1a;管理员&#xff08;农家乐管理、美食信息管理、住宿信息管理、活动信息、用户管理、活动报名、论坛等&#xff09;&#xff0c;普通用户&#xff08;注册登录、活动报名、客房预订、用户评价、收藏管理、模拟支付等&#xff09;技术选型&#…...

用 Python 从零开始创建神经网络(九):反向传播(Backpropagation)(还在更新中。。。)

反向传播&#xff08;Backpropagation&#xff09; 引言1. 分类交叉熵损失导数&#xff08;Categorical Cross-Entropy loss derivative&#xff09;2. 分类交叉熵损失衍生代码实现3. Softmax激活导数&#xff08;Softmax activation derivative&#xff09;4. Softmax激活函数…...

nli-distilroberta-base惊艳案例:支持自定义label映射的灵活NLI接口设计实践

nli-distilroberta-base惊艳案例&#xff1a;支持自定义label映射的灵活NLI接口设计实践 1. 项目概述 自然语言推理&#xff08;NLI&#xff09;是理解文本语义关系的重要技术。nli-distilroberta-base基于轻量高效的DistilRoBERTa模型&#xff0c;提供了强大的句子对关系判断…...

RC5红外协议底层实现与嵌入式集成指南

1. RC5协议底层实现技术解析RC5是一种由Philips&#xff08;现NXP&#xff09;于1980年代设计的红外遥控通信协议&#xff0c;广泛应用于电视、机顶盒、音响等消费电子设备。与通用异步收发器&#xff08;UART&#xff09;或IC等同步总线不同&#xff0c;RC5采用双相曼彻斯特编…...

SpringBoot实战:高效读取resources目录文件并实现安全下载

1. 为什么需要从resources目录读取文件&#xff1f; 在日常开发中&#xff0c;我们经常会遇到需要提供文件下载功能的场景。比如导出Excel报表、下载PDF合同、获取系统模板文件等。这些文件通常具有以下特点&#xff1a; 相对固定&#xff1a;内容不会频繁变动&#xff0c;比如…...

Gigasoft ProEssentials 使AI助手能够通过实时访问API图表配置并提供支持答案

利用人工智能访问改进图表开发Gigasoft ProEssentials 使 AI 助手能够通过实时访问 API 生成精确的图表配置并提供支持答案。Gigasoft ProEssentials 是一款功能强大的 Windows 开发图表库&#xff0c;提供丰富的 2D 和 3D 图表类型。该产品提供了一套用途广泛的组件&#xff0…...

别再让漏洞扫描报警了!手把手教你给老旧Linux服务器升级OpenSSH和OpenSSL(附systemd服务修复秘籍)

企业级Linux服务器安全加固实战&#xff1a;OpenSSH与OpenSSL深度升级指南 凌晨三点&#xff0c;刺耳的安全告警声再次划破运维中心的宁静——漏洞扫描报告上醒目的红色标记显示&#xff1a;OpenSSH 7.4存在CVE-2023-38408高危漏洞。这不是演习&#xff0c;而是每位运维工程师都…...

从71.5%到87.5%:我是如何用PyTorch+ResNeXt101优化GTZAN音乐分类精度的(附完整代码)

从71.5%到87.5%&#xff1a;PyTorch音乐分类模型优化实战全解析 音乐分类任务一直是音频处理领域的热门研究方向。在GTZAN数据集上&#xff0c;我们经常会遇到基础模型表现不佳的问题——比如使用ResNet18时验证集准确率仅能达到71.5%。本文将详细分享如何通过一系列优化策略&a…...

Vivado工程管理神器:TCL脚本一键重建工程(附完整脚本代码)

Vivado工程管理神器&#xff1a;TCL脚本一键重建工程&#xff08;附完整脚本代码&#xff09; 在FPGA开发领域&#xff0c;Vivado作为主流开发工具&#xff0c;其工程文件的管理一直是团队协作和版本控制中的痛点。每次更换开发环境或与团队成员共享工程时&#xff0c;传统方法…...

音乐格式转换全攻略:QMCDecode破解QQ音乐加密文件处理难题

音乐格式转换全攻略&#xff1a;QMCDecode破解QQ音乐加密文件处理难题 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默…...

python-玩具租赁系统 玩具销售商城购物系统vue

目录实现计划概述技术栈选择核心功能模块开发阶段划分部署与优化注意事项项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作实现计划概述 开发一个结合玩具租赁和销售功能的商城系统&#xff0c;采用前后端分离架构。前端使用Vue…...

流程管理系统功能拆解:如何解决传统流程管理中的协作难题与审批场景效率问题

在传统的企业运营中&#xff0c;流程管理往往因缺乏数字化工具而陷入僵局&#xff0c;导致部门间协作难题频发&#xff0c;特别是在关键的审批场景下&#xff0c;人工流转的低效直接引发了严重的效率问题&#xff1b;要彻底破局&#xff0c;必须引入智能化的流程管理系统&#…...