前端算法之二叉树

  • 二叉树
    • 二叉树用于解决什么问题
      • 数据的组织与搜索:
      • 排序:
      • 表达式和计算:
      • 图形处理:
    • 举例:二叉树的最近公共祖先
      • 思路: 排序/排布方式 和 (排序中)当前树和节点的关系
    • 举例2:二叉搜索树的最近公共祖先

二叉树

二叉树是一种常见的树状数据结构,它由节点组成,每个节点最多有两个子节点:

  • 左子节点
  • 右子节点

这两个子节点可以为空,也可以连接到其他节点。二叉树具有以下特点:

  1. 每个节点最多有两个子节点。
  2. 左子节点在父节点的左边,右子节点在父节点的右边。
  3. 子节点可以为空。

下面是一个简单的二叉树例子:

     1/   \2     3/ \   / \
4   5 6   7

在这个例子中,数字表示节点的值,箭头表示子节点的连接关系。

根节点是1,它的左子节点是2,右子节点是3。节点2的左子节点是4,右子节点是5。节点3的左子节点是6,右子节点是7。

这就是一个二叉树的示例,每个节点最多有两个子节点,符合二叉树的定义。
更多详细内容,请微信搜索“前端爱好者戳我 查看

前端设计的是遍历问题,例如:任意两个节点的最小的祖先

二叉树用于解决什么问题

二叉树是一种数据结构,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。这种数据结构通常用于解决各种问题,其中包括但不限于:

数据的组织与搜索:

二叉搜索树 (BST) 是一种常见的二叉树,它可以快速进行搜索、插入和删除操作。通过比较节点的值,可以有效地定位数据项,这在数据库索引和搜索引擎等领域很有用。

举例:在一个包含许多单词的二叉搜索树中搜索一个特定的单词,可以快速定位到该单词并提供相关信息。

排序:

二叉树可以用于排序算法中。比如,通过构建二叉搜索树并进行中序遍历,可以获得有序的数据。

举例:对一组数字进行排序,将它们构建成二叉搜索树,然后进行中序遍历,即可得到有序的数字序列。

表达式和计算:

表达式树是一种二叉树,用于表示数学表达式。它可以帮助进行表达式求值和运算。

举例:将数学表达式如"(3 + 4) * 5"表示成对应的二叉树结构,便于进行运算和求值。

图形处理:

在计算机图形学中,二叉树结构可以用来表示场景图或层次结构,例如场景中的物体组织结构。

举例:用二叉树表示一个计算机游戏中的场景,每个节点代表一个物体或者一个场景元素,并用树的结构表示它们之间的层次关系。

这些只是二叉树应用的一部分,它们在各种领域都有广泛的应用。

举例:二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

leetcode地址:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

提示:

树中节点数目在范围 [2, 105] 内。
-109 <= Node.val <= 109
所有 Node.val 互不相同 。
p != q
p 和 q 均存在于给定的二叉树中。
思路: 排序/排布方式 和 (排序中)当前树和节点的关系
  • 都位于左侧

  • 位于两测

递归:

返回当前子树中,p和q 的最近祖先,没有,返回null1. 当前遍历到p或者 q.不无要往下遍历,返回当前p q
2. 遍历到null,没有p q,返回nul
3. 遍历子树,左子树 右子树 都有结果,返回root
4. 只有其中一个子树有结果 p / q 只在这个子树下返回 null,null

结果:

/*** Definition for a binary tree node.* function TreeNode(val) {*     this.val = val;*     this.left = this.right = null;* }*/
/*** @param {TreeNode} root* @param {TreeNode} p* @param {TreeNode} q* @return {TreeNode}*/
var lowestCommonAncestor = function(root, p, q) {if(root == null){return null}// 遇到p,遇到q,直接返回当前的节点if(root ==p || root == q){return root}// 递归操作const left = lowestCommonAncestor(root.left, p, q)const right = lowestCommonAncestor(root.right, p, q)// 如果左子树和右子树都有节点,则返回rootif(left && right) {return root}// 如果左节点没有,则返回右侧子树if(!left){return right}// 如果右节点没有,则返回左侧子树if(!right){return left}
};

举例2:二叉搜索树的最近公共祖先

leetcode地址:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉搜索树中。

解答

/*** Definition for a binary tree node.* function TreeNode(val) {*     this.val = val;*     this.left = this.right = null;* }*//*** @param {TreeNode} root* @param {TreeNode} p* @param {TreeNode} q* @return {TreeNode}*/
var lowestCommonAncestor = function(root, p, q) {if(root == null){return null}// 遇到p,遇到q,直接返回当前的节点if(root ==p || root == q){return root}// 递归操作const left = lowestCommonAncestor(root.left, p, q)const right = lowestCommonAncestor(root.right, p, q)// 如果左子树和右子树都有节点,则返回rootif(left && right) {return root}// 如果左节点没有,则返回右侧子树if(!left){return right}// 如果右节点没有,则返回左侧子树if(!right){return left}
};

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

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

相关文章

光照贴图的参数化

正如Jon在上一篇文章中所解释的那样&#xff0c;我们在《见证者》中使用了预先计算的全局照明&#xff0c;而我的首要任务之一就是开发该系统。 我开发了一些有趣的技术来计算自动参数化&#xff0c;以一种可以轻松映射到 GPU 的方式制定照明计算&#xff0c;并通过使用辐照度…

【如何选择Mysql服务器的CPU核数及内存大小】

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容&#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作…

Codeium在IDEA里的3个坑

转载自Codeium在IDEA里的3个坑&#xff1a;无法log in&#xff0c;downloading language server和中文乱码_downloading codeium language server...-CSDN博客文章浏览阅读1.7w次&#xff0c;点赞26次&#xff0c;收藏47次。Codeium安装IDEA插件的3个常见坑_downloading codeiu…

Nginx配置压缩和解压缩

压缩服务器响应&#xff0c;或为不支持压缩的客户端解压缩它们&#xff0c;以提高传递速度并减少服务器开销。 压缩响应通常会显著减小传输数据的大小。但是&#xff0c;由于压缩发生在运行时&#xff0c;因此它也会增加相当大的处理开销&#xff0c;从而对性能产生负面影响。…

4-2. AOP细节

1 AOP细节 1.1 切入点表达式 1.1.1 作用 通过表达式的方式定位一个或多个具体的连接点。 1.1.2 语法细节 1&#xff09;切入点表达式的语法格式 execution([权限修饰符] [返回值类型] [简单类名/全类名] 方法名) 2) 举例说明 3&#xff09;在AspectJ中&#xff0c;切入…

通过国家网络风险管理方法提供安全的网络环境

印度尼西亚通过讨论网络安全法草案启动了其战略举措。不过&#xff0c;政府和议会尚未就该法案的多项内容达成一致。另一方面&#xff0c;制定战略性、全面的网络安全方法的紧迫性从未像今天这样重要。 其政府官方网站遭受了多起网络攻击&#xff0c;引发了人们对国家网络安全…

小肥柴慢慢手写数据结构(C篇)(5-2 AVL树)

小肥柴慢慢学习数据结构笔记&#xff08;C篇&#xff09;&#xff08;5-2 AVL树 目录5-5 AVL出现的原因5-5-1 平衡树5-5-2 平衡二叉树的具体案例 5-6 AVL平衡策略的讨论5-7 不使用平衡因子的实现&#xff08;黑皮书&#xff0c;训练思维&#xff09;5-8 使用平衡因子的实现&…

C++ 编程必备:对象生命周期管理的最佳实践

在C中&#xff0c;对象的生命周期是指对象存在的时间段&#xff0c;从对象创建到对象销毁的整个过程。正确地管理对象的生命周期是编写高效、可靠C代码的关键之一 对象的创建 在C中&#xff0c;对象可以通过三种方式创建&#xff1a;静态分配、自动分配和动态分配。 静态分配…

普中STM32-PZ6806L开发板(USART2 串口 + HI-LINK-V20离线语音模块控制LED灯)

简介 买了HI-LINK-V20型号的离线语音识别模块, 为了后面可以做有意思的东西, 现在先来用用, 使用USART2 串口 接收来自我在HI-LINK-V20中预设的动作, 当识别到词条时发送对应的指令到串口, HI-LINK串口接的就是STM32F03ZET6的USART2, 且往下看。 电路原理图 连线图 连线引脚表…

Linux:/proc/sys/vm/目录各文件详解

目录 前言一、/proc/sys/vm/目录各文件二、相关功能的API函数 前言 /proc/sys/vm/ 目录是 Linux 系统中的一个特殊目录&#xff0c;它包含了与虚拟内存子系统相关的系统内核参数。这些参数可以用来配置系统的虚拟内存管理策略&#xff0c;包括内存分配、页面置换、内存压缩、NU…

C读取文件大小的几种方式

一 标准库 fseek 至尾部 读取ftell返回 #include <stdio.h>int main(int argc, char** argv) {char* filenameargv[1];FILE* fp fopen(filename, "r");long int size ;fseek(fp, 0, SEEK_END);size ftell(fp);printf("%s size is %ld\n",filename…

数据库和数据库编程

数据库、数据表、表数据操作以及数据库编程相关的知识点 1. 数据库的概念&#xff1a; 数据库是用于存储和组织数据的系统。数据库管理系统(DBMS)是管理数据库的软件&#xff0c;提供对数据的访问、查询和维护。关系型数据库是一种通过表格结构来组织和管理数据的数据库。 2…

数据结构【线性表篇】(四)

数据结构【线性表篇】(四&#xff09; 文章目录 数据结构【线性表篇】(四&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录一、栈(一)、栈的顺序存储(二)、栈的链式存储(三)、共享栈 二、队列(一)、队列的顺序存储(二)、队列的…

【react.js + hooks】useUrl 监听路由参数

【react.js hooks】useUrl 监听路由参数 本节我们来实现一个监听并解析 URL 参数的 hook&#xff1a;useUrl。而且这个 hook 的返回类型是可推断的。 实现思路 监听 URL 变化 - 事件监听根据 URL 地址获取参数并返回 - 依赖工具方法推断参数结构 - 泛型参数&#xff08;对象…

Nginx 不同源Https请求Http 报strict-origin-when-cross-origin

原因&#xff1a; nginx代理配置url指向只开放了/* 而我/*/*多了一层路径 成功&#xff1a;

2024新版塔罗占卜网站源码风水起名附带搭建视频及文本教程

附带文本教学及视频教程安装方法以linux为例&#xff1a; 1、建议在服务器上面安装宝塔面板&#xff0c;以便操作&#xff0c;高逼格技术员可以忽略这步操作。 2、把安装包文件解压到根目录&#xff0c;同时建立数据库&#xff0c;把数据文件导入数据库 3、修改核心文件conf…

python多环境管理工具——pyenv-win安装与使用教程

目录 pyenv-win简介 pyenv-win安装 配置环境变量 pyenv的基本命令 pyenv安装py环境 pyenv安装遇到问题 pycharm测试 pyenv-win简介 什么是pyenv-win&#xff1a; 是一个在windows系统上管理python版本的工具。它是pyenv的windows版本&#xff0c;旨在提供类似于unix/li…

ASP.NET Core SignalR推送服务器日志

产线机器人项目,上位机以读写寄存器的方式控制机器人,服务器就是用 ASP.NET Core 写的 Web API。由于前一位开发者写的代码质量问题,导致上位机需要16秒才能启动。经过改造,除了保留业务逻辑代码,其他的基本重写。如今上位机的启动时间在网络状态良好的条件下可以秒启动。…

Avalonia 跨ViewModel访问数据或方法

在Avalonia应用程序中&#xff0c;跨ViewModel访问数据或方法通常是为了实现不同视图间的数据共享和通信。在MVVM设计模式下&#xff0c;这可以通过多种方式进行&#xff1a; 依赖注入&#xff08;DI&#xff09;&#xff1a; 通过IoC容器&#xff08;如Autofac、DryIoc等&…

工作八年经验总结

今年没怎么写博客了&#xff0c;2023年一共才发了5篇&#xff0c;在CSDN的排名也是名落孙山&#xff08;从最辉煌时的几百名落到了180w&#xff09;&#xff0c;在纠结要不要断更&#xff0c;算了&#xff0c;今年我还是在矫情下吧。。。。 【工作篇】 1、2023挑战与机遇并存…