前端算法之二叉树

  • 二叉树
    • 二叉树用于解决什么问题
      • 数据的组织与搜索:
      • 排序:
      • 表达式和计算:
      • 图形处理:
    • 举例:二叉树的最近公共祖先
      • 思路: 排序/排布方式 和 (排序中)当前树和节点的关系
    • 举例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 的最近祖先,没有,返回null

1. 当前遍历到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)

    // 如果左子树和右子树都有节点,则返回root
    if(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)

    // 如果左子树和右子树都有节点,则返回root
    if(left && right) {
        return root
    }

    // 如果左节点没有,则返回右侧子树
    if(!left){
        return right
    }

    // 如果右节点没有,则返回左侧子树
    if(!right){
        return left
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历(leetcode)

目录 一、二叉树的前序遍历 方法一&#xff1a;全局变量记录节点个数 方法二&#xff1a;传址调用记录节点个数 二、二叉树的最大深度 三、平衡二叉树 四、二叉树遍历 一、二叉树的前序遍历 方法一&#xff1a;全局变量记录节点个数 计算树的节点数: 函数TreeSize用于递…

Zookeeper注册中心实战

Java学习手册面试指南&#xff1a;https://javaxiaobear.cn Spring Cloud Zookeeper通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法&#xff0c;为 Spring Boot 应用程序提供Apache Zookeeper集成。通过一些简单的注释&#xff0c;您可以快速启用和配置应用…

51单片机中TCON, IE, PCON等寄存器的剖析

在单片机中&#xff0c;如何快速通过名字记忆IQ寄存器中每一个控制位的作用呢&#xff1f; IE&#xff08;interrupt enable&#xff09;寄存器中&#xff0c;都是中断的使能位置。 其中的EA&#xff08;enable all&#xff09;是总使能位&#xff0c;ES(enable serial)是串口…

Head First Design Patterns - 装饰者模式

什么是装饰者模式 装饰者模式动态地将额外责任附加到对象上。对于拓展功能&#xff0c;装饰者提供子类化的弹性替代方案。 --《Head First Design Patterns》中的定义 为什么会有装饰者模式 根据上述定义&#xff0c;简单来说&#xff0c;装饰者模式就是对原有的类&#xff0c…

STM32与TB6612电机驱动器的基础入门教程

TB6612是一款常用的双路直流电机驱动芯片&#xff0c;适用于小型机器人以及其他需要控制电机方向和转速的应用。在STM32微控制器的配合下&#xff0c;可以实现对TB6612电机驱动器的控制&#xff0c;进而实现电机的控制。本文将带领读者一步步了解如何搭建基于STM32与TB6612的电…

华为云默认安全组配置规则说明

华为云服务器默认安全组可选Sys-default、Sys-WebServer或Sys-FullAccess。default是默认安全组规则&#xff0c;只开放了22和3389端口&#xff1b;Sys-WebServer适用于Web网站开发场景&#xff0c;开放了80和443端口&#xff1b;Sys-FullAccess开放了全部端口。阿腾云atengyun…

机器学习——主成分分析(PCA)

目录 背景 引入 特征维度约减 特征维度约减的概念 为何要维度约减? 维度约减的应用 常规维度约减方法 主成分分析 主成分分析 (PCA)基本思路 主成分的代数定义和代数推导 主成分的代数定义 主成分的代数推导 PCA算法两种实现方法 1、基于特征值分解协方差矩阵实…

以太网二层交换机实验

实验目的&#xff1a; &#xff08;1&#xff09;理解二层交换机的原理及工作方式&#xff1b; &#xff08;2&#xff09;利用交换机组建小型交换式局域网。 实验器材&#xff1a; Cisco packet 实验内容&#xff1a; 本实验可用一台主机去ping另一台主机&#xff0c;并…

GRU算法

前置知识&#xff1a;RNN&#xff0c;LSTM LSTM需要训练的参数很多&#xff0c;极消耗计算资源。GRU是一种LSTM的改进算法&#xff0c;参数更少&#xff0c;更容易训练。 它将忘记门和输入门合并成为一个单一的更新门&#xff0c;同时合并了数据单元状态和隐藏状态&#xff0…

系列二、RestTemplate简介

一、RestTemplate简介 1.1、概述 RestTemplate是一种便捷的访问RestFul服务的模板类&#xff0c;是Spring提供的用于访问Rest服务的客户端模板工具集&#xff0c;它提供了多种便捷访问远程HTTP服务的方法。 1.2、API https://docs.spring.io/spring-framework/docs/5.2.2.REL…

Linux实战:部署基于Postfix 与 Dovecot 的邮件系统

一、电子邮件系统简介 在电子邮件系统中&#xff0c;为用户收发邮件的服务器名为邮件用户代理&#xff08;Mail User Agent&#xff0c;MUA&#xff09;&#xff0c;MTA &#xff08;邮件传输代理&#xff09;的工作职责是转发处理不同电子邮件服务供应商之间的邮件&#xff0…

docker 部署教学版本

文章目录 一、docker使用场景及常用命令1&#xff09;docker使用场景2&#xff09;rocky8(centos8)安装 docker3&#xff09;docker 常用命令补充常用命令 二、 单独部署每个镜像&#xff0c;部署spring 应用镜像推荐&#xff08;2023-12-18&#xff09;1、 安装使用 mysql1.1 …

WEB 3D技术 three.js通过光线投射 完成几何体与外界的事件交互

本文 我们来说 光线投射 光线投射技术是用于3维空间场景中的交互事件 我们先编写代码如下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";const scene new THRE…

Django Web框架

1、创建PyCharm项目 2、安装框架 pip install django 3、查看安装的包列表 4、使用命令创建django项目 django-admin startproject web 5、目录结构 6、运行 cd web python manage.py runserver7、初始化后台登录的用户名密码 执行数据库迁移生成数据表 python manage.p…

VMware17安装Centos 7.9

1.下载VMware17&#xff0c;下载 VMware Workstation Pro | CN 没有注册码&#xff0c;某多&#xff0c;某宝2元子买一个&#xff1b; 2.下载centos7.9镜像&#xff0c; 3.选择稍后安装操作系统 (如果选择安装程序光盘映像文件&#xff0c;则会按照最小系统自动安装) 4.选择…

华为鸿蒙运行Hello World

前言&#xff1a; 从11月中旬开始通过B站帝心接触鸿蒙&#xff0c;至今一个半月左右不到&#xff0c;从小白到入坑&#xff0c;再到看官网案例&#xff0c;分析案例&#xff0c;了解技术点&#xff0c;还需要理清思路&#xff0c;再写博客&#xff0c;在决定写 &#xff1c;Har…

跟着cherno手搓游戏引擎【3】事件系统和预编译头文件

不多说了直接上代码&#xff0c;课程中的架构讲的比较宽泛&#xff0c;而且有些方法写完之后并未测试。所以先把代码写完。理解其原理&#xff0c;未来使用时候会再此完善此博客。 文件架构&#xff1a; Event.h:核心基类 #pragma once #include"../Core.h" #inclu…

【java爬虫】股票数据获取工具前后端代码

前面我们有好多文章都是在介绍股票数据获取工具&#xff0c;这是一个前后端分离项目 后端技术栈&#xff1a;springboot&#xff0c;sqlite&#xff0c;jdbcTemplate&#xff0c;okhttp 前端技术栈&#xff1a;vue&#xff0c;element-plus&#xff0c;echarts&#xff0c;ax…

WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形

文章目录 前言相关链接项目专栏运行环境匹配图片矩形鼠标绘制Halcon添加右键事件Task封装运行结果个人引用问题原因推测 圆形鼠标绘制代码运行结果 课程完结&#xff1a; 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视…

Redis 与 Spring: 解决序列化异常的探索之旅

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…