递归、搜索与回溯算法——二叉树的深搜

在这里插入图片描述

T04BF

👋专栏: 算法|JAVA|MySQL|C语言

🫵 小比特 大梦想

此篇文章与大家分享分治递归、搜索与回溯算法中关于二叉树的深搜的专题
如果有不足的或者错误的请您指出!

目录

  • 1.计算布尔值的二叉树
    • 1.1解析
    • 1.2题解
  • 2.求根节点到叶子节点数字之和
    • 2.1解析
    • 2.2题解
  • 3.二叉树剪枝
    • 3.1解析
    • 3.2题解
  • 4.验证二叉搜索树
    • 4.1解析
    • 4.2题解
  • 5.二叉搜索树中第K小的元素
    • 5.1解析
    • 5.2题解
  • 6.二叉树的所有路径
    • 6.1解析
    • 6.2题解

1.计算布尔值的二叉树

题目:计算布尔值的二叉树

1.1解析

这道题实际上就是二叉树深度优先遍历的体现,我们想知道根节点的布尔值,就需要由根节点的left 和 right 和 根节点的值有关
那么我们就需要先求出root.left 和 root.right 的布尔值,这就是深度优先遍历
而其中我们可以很容易发现一个"子问题",就是求出root.left 和 root.right 的布尔值,那么就可以通过递归来做
那么递归的出口是什么?? 就是找到叶子结点

1.2题解

    public boolean evaluateTree(TreeNode root) {if(root.val == 0) {return false;}if(root.val == 1) {return true;}boolean left = evaluateTree(root.left);boolean right = evaluateTree(root.right);return (root.val == 2) ? (left || right) : (left && right);}

2.求根节点到叶子节点数字之和

题目:求根节点到叶子节点的数字之和

2.1解析

实际上也是深度优遍历的体现,我们要知道根节点要叶子节点的数字之和,就要用求出根节点的 left到叶子节点的数字之和 加上 根节点的 right到叶子节点的数字之和.同样可以用递归来做
其中有一个细节就是,我们此时不是简单的求出各个节点的数字之和,是拼接起来的
我们可以将上层节点的节点值 通过传参的方式来实现拼接
如下图所示
在这里插入图片描述

2.2题解

    private int sum(TreeNode root,int n) {int preNum = n * 10 + root.val;if(root.left == null && root.right == null) {return preNum;}int ret = 0;if(root.left != null) {ret += sum(root.left,preNum);}if(root.right != null) {ret += sum(root.right,preNum);}return ret;}public int sumNumbers(TreeNode root) {if(root == null) {return 0;}return sum(root,0);}

3.二叉树剪枝

题目:二叉树剪枝

3.1解析

我们可以采⽤后序遍历的⽅式来解决这个问题。在后序遍历中,我们先处理左子树,然后处理
右子树,最后再处理当前节点。
在处理当前节点时,我们可以判断其是否为叶⼦节点且其值是否为 0,如果为o就直接删除
就可以使用递归来做,递归的出口就是遇到叶子结点

3.2题解

    public TreeNode pruneTree(TreeNode root) {if(root == null) {return null;}root.left = pruneTree(root.left);root.right = pruneTree(root.right);if(root.left == null && root.right == null && root.val == 0) {return null;}return root;}

4.验证二叉搜索树

验证二叉搜索树

4.1解析

二叉搜索树有一个特征,就是这棵数的中序遍历结果,是一个升序的序列
那么我们就可以以中序遍历的方式来遍历这棵二叉树
一个直观的方法就是创建一个空间来存放中序遍历的结果,但是空间复杂度较高
我们实际上可以在方法外面定义一个变量preNum,将每次遍历的节点的值与preNum做比较,如果是 > preNum,那么就将preNum改为这个节点的值,如果是小于,说明不是升序,那么就要返回false
还有一个提升效率的细节问题就是
在这里插入图片描述
如果出现如图所示的情况,由于我们是中序遍历,遍历到绿色这一部分到时候,就发现不是一棵二叉树搜索树了,但是按照我们上面的逻辑,是需要将右边整个子树都遍历完才能返回结果
但是这样的操作是没必要的,因此我们如果在某次判断完左枝如果已经返回false,那么右枝就没必要判断了,直接返回false即可
这就是"剪枝"操作

4.2题解

    private long preNum = Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root == null) {return true;}boolean left = isValidBST(root.left);if(!left) {return false;//剪枝}if(preNum < root.val) {preNum = root.val;}else{return false;}boolean right = isValidBST(root.right);return left && right;}

5.二叉搜索树中第K小的元素

题目:二叉搜索树中第K小的元素

5.1解析

按照上一题提到,二叉搜索树的中序遍历结果是升序序列
那么要寻找第k小的元素,我们只需要对二叉搜索树进行中序遍历,遍历到第k个节点的时候,就是第k小的元素
我们可以在方法外定义一个变量count = k,每遍历一个节点,count–,直到k = 0,此时这个值就是我们想要的值
同样,当count = 0的时候,此时说明第k小的元素已经找到的,就不需要再遍历了,因此我们可以将这个条件加在每一次递归的前面,即"剪枝"

5.2题解

    private int count = 0;private int ret = 0;public int kthSmallest(TreeNode root, int k) {count = k;dfs(root);return ret;}private void dfs(TreeNode root) {if(root == null || count == 0) {return;}dfs(root.left);count--;if(count == 0) {ret = root.val;return;}dfs(root.right);}

6.二叉树的所有路径

题目:二叉树的所有路径

6.1解析

从根节点开始找二叉树的路径,本质上就是前序遍历的过程
但是我们此时不仅仅是简单的进行前序遍历,我们还要将当前已经遍历到的路径作为参数传递
当递归到叶子结点的时候,将当前的路径加入到返回列队中即可
在这里插入图片描述

6.2题解

    List<String> ret;public List<String> binaryTreePaths(TreeNode root){ret = new ArrayList<>();dfs(root, new StringBuffer());return ret;}void dfs(TreeNode root, StringBuffer _path){StringBuffer path = new StringBuffer(_path);path.append(Integer.toString(root.val));if(root.left == null && root.right == null){ret.add(path.toString());return;}path.append("->");if(root.left != null) dfs(root.left, path);if(root.right != null) dfs(root.right, path);}

在这里插入图片描述

T04BF

🫵 小比特 大梦想

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

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

相关文章

【漏洞复现】泛微E-Office jx2_config 存在信息泄露漏洞

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

超声波洗眼镜机有用吗?哪些洗眼镜值得入?超声波洗眼镜好不好用

在日常生活中&#xff0c;眼镜不仅是视力不佳者的重要辅助工具&#xff0c;更是时尚搭配的一部分。然而&#xff0c;长时间佩戴眼镜会不可避免地积累各种污垢和细菌&#xff0c;从油脂、指纹到灰尘等&#xff0c;这些不仅影响视觉效果&#xff0c;更有可能对眼部健康造成潜在威…

云服务器安装Mysql、MariaDB、Redis、tomcat、nginx

前置工作 进入根目录 cd / 都在/usr/local/src文件夹&#xff09; 上传压缩包 rz 压缩包 Mysql 1.下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum…

黑马程序员——mysql——day05——反射、注解、动态代理

目录&#xff1a; 类的加载 目标讲解 类的加载过程类的加载机制小结类加载器 目标讲解 类加载器的作用类加载器的分类&#xff1a;获取类加载器的方式小结双亲委派机制 目标讲解 3种类加载器的关系双亲委派机制小结反射:概述 目标讲解 反射反射技术的应用案例&#xff1a;反射…

Python实现exe小工具

1、实例代码 import tkinter as tk from tkinter import messagebox from tkinter import ttk import requestsdef submit():input_text entry.get()if len(input_text) 0:messagebox.showinfo("提示", "请输入您所要提问的问题&#xff01;")returnsel…

Python 数据结构和算法实用指南(一)

原文&#xff1a;zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 数据结构和算法是信息技术和计算机科学工程学习中最重要的核心学科之一。本书旨在提供数据结构和算法的深入知识&#xff0c;以及编程…

uniapp之消除图片的空白占用空间

我们在使用uniapp开发的过程中一定会遇到一个情况就是我们加载的图片总有一点空白出现在不该出现的地方代码如下 <view style"background:#ff0000;"><image style"width:100%;"src"https://t7.baidu.com/it/u1819248061,230866778&fm19…

HarmonyOS真机调试页面运行卡顿/黑屏解决方法,亲测有效

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 用mate40等发行时间相对较早但系统是HarmonyOS4.0的真机调试 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 程序点击容易卡顿或黑屏 原因分析&#xff1a; CPU兼容问题导致屏幕…

[Collection与数据结构] 二叉树(三):二叉树精选OJ例题(下)

1.二叉树的分层遍历 OJ链接 上面这道题是分层式的层序遍历,每一层有哪些结点都很明确,我们先想一想普通的层序遍历怎么做 /*** 层序遍历* param root*/public void levelOrder1(Node root){Queue<Node> queue new LinkedList<>();queue.offer(root);while (!qu…

Resilience中的RateLimiter

Resilience中的RateLimiter 一、RateLimiter&#xff08;限流&#xff09;1.常见的限流算法漏桶算法&#xff08;Leaky Bucket&#xff09;令牌桶算法&#xff08;Token Bucket&#xff09;——Spring cloud 默认使用该算法滚动时间窗口&#xff08;tumbling time window&#…

项目7-音乐播放器4+喜欢/收藏音乐

1.喜欢/收藏音乐模块设计 1.1 请求响应模块设计 请求&#xff1a; { post, /lovemusic/likeMusic data: id//音乐id } 响应&#xff1a; { "status": 0, "message": "点赞音乐成功", "da…

FPGA - ZYNQ 基于EMIO的PS和PL交互

前言&#xff1a; Xilinx ZYNQ系列的芯片&#xff0c;GPIO分为 MIO 、EMIO、AXI_GPIO三种方式。 MIO &#xff1a;固定管脚&#xff0c;属于PS端&#xff0c;也就是ARM端。 EMIO &#xff1a;通过PL扩展&#xff0c;使用时需要分配PL(FPGA)管脚&#xff0c;消耗PL端资源。…

嵌入式硬件需要过哪几关?

目标是成为一名硬件工程师,用电烙铁和电路板一统江湖,游戏共有九关。 第一关:基础基础还是基础! 你要有一定的基础,模电,数电这些都得会一些。一般科班出身的专业有电信,通信,自动化等等。 你如果完全没这些基础,连电阻,电容都不认识,那就需要在这关待上很久啦。 …

混合app开发

安卓与h5交互 原生调用js js调用原生 ios与h5交互 代码演示 ios调用h5 xcode创建一个ios项目 h5调用原生 h5部分代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conten…

论文解读:(CoOp)Learning to Prompt for Vision-Language Models

文章汇总 存在的问题 虽然训练类别通常具有文本形式&#xff0c;例如“金鱼”或“卫生纸”&#xff0c;但它们将被转换为离散标签&#xff0c;只是为了简化交叉熵损失的计算&#xff0c;从而使文本中的语义封装在很大程度上未被利用。这样的学习范式将视觉识别系统限制在闭集…

claude国内不能用

AnthropicAI 公司旗下的Claude 3 大型语言模型&#xff0c;以其卓越的性能直接挑战了GPT-4的市场地位。Claude 3 系列中包含了几个不同版本&#xff0c;如Claude 3 Opus、Claude 3 Sonnet 以及 Claude 3 Haiku&#xff0c;每个版本都针对特定的应用场景进行了优化。 在这些版本…

通过阿里云向量检索 Milvus 版和通义千问快速构建基于专属知识库的问答系统

背景介绍 阿里云向量检索 Milvus 版是一款 Serverless 全托管服务&#xff0c;确保了与开源 Milvus 的完全兼容性&#xff0c;并支持无缝迁移。它在开源版本的基础上增强了可扩展性&#xff0c;能提供大规模 AI 向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力…

土壤多营养级分析经典思路:细菌+真菌

摘要 羊肚菌的人工栽培一直是全球研究的热点&#xff0c;了解土壤微生物生态对提高羊肚菌产量和减轻病原菌危害具有重要意义。以往的研究往往聚焦到细菌或真菌单一群落。本研究探究土壤中细菌真菌多营养级联合分析&#xff0c;更加深入的确定羊肚菌生长与土壤微生物生态之间的潜…

Netty学习——实战篇5 Netty 心跳监测/WebSocket长连接编程

1 心跳监测 MyServer.java public class MyServer {public static void main(String[] args) {NioEventLoopGroup bossGroup new NioEventLoopGroup(1);NioEventLoopGroup workerGroup new NioEventLoopGroup();try {ServerBootstrap serverBootstrap new ServerBootstrap…

SpringMVC(二)【请求与响应】

0、测试环境 我们简化开发&#xff0c;创建一个简单的环境&#xff08;因为没有其它包比如 service、dao&#xff0c;所以这里不用 Spring 容器&#xff0c;只用 SpringMVC 容器&#xff09;&#xff1a; Servelet 容器配置&#xff1a; package com.lyh.config;import org.s…