一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题

树是一种分层数据的抽象模型

二叉树

二叉树中的节点最多只能有两个子节点,一个是左侧子节点,另一个是右侧子节点

二叉搜索树

二叉搜索树(BST)是二叉树的一种,但是只允许你在左侧节点存储(比父节点)小的值,在右侧节点存储(比父节点)大的值。

二叉树的遍历

中序遍历是一种以上行顺序访问BST所有节点的遍历方式,也就是以从最小到最大的顺序访问所有节点中序追历的一种应用就是对树进行排序操作

先序遍历是以优先于后代节点的顺序访问每JJ k个节点的。先序遍历的一种应用是打印一个结构
化的文档。

后序遍历则是先访问节点的后代节点,再访问节点本身。后序遍历的一种应用是计算一个目录及其子目录中所有文件所占空间的大小

封装一个二叉搜索树

const Compare = {

less: -1,

bigger: 1,

equ:0

}

class Node{

constructor(val){

this.val = val

this.left = null

this.right = null

}

}

class BST{

constructor(){

this.root = null

}

insert(val){

if(this.root === null){

this.root = new Node(val)

}else{

this.insertNode(this.root,val)

}

}

insertNode(node,val){

if(this.compareFn(val,node.val) ===Compare.less){

if(node.left === null){

node.left = new Node(val)

}else{

this.insertNode(node.left,val)

}

}else{

if(node.right === null){

node.right = new Node(val)

}else{

this.insertNode(node.right,val)

}

}

  

}

compareFn(a,b){

if(a ===b){

return Compare.equ

}

return a <b ? Compare.less : Compare.bigger

}

inOrderMap(callback){

// this.inOrderMapNode(this.root,callback)

this.preOrderMapNode(this.root,callback)

// this.postOrderMapNode(this.root,callback)

}

//中序遍历

inOrderMapNode(node,callback){

if(node!=null){

this.inOrderMapNode(node.left,callback)

callback(node.val)

this.inOrderMapNode(node.right,callback)

}

}

//先序遍历

preOrderMapNode(node,callback){

if(node!=null){

callback(node.val)

this.preOrderMapNode(node.left,callback)

this.preOrderMapNode(node.right,callback)

}

}

//后序遍历

postOrderMapNode(node,callback){

callback(node.val)

this.postOrderMapNode(node.left,callback)

this.postOrderMapNode(node.right,callback)

}

//最小子节点

minNode(){

let current = this.root

while(current != null && current.left !=null){

current = current.left

}

return current.val

}

maxNode(){

let current = this.root

while(current != null && current.right!=null){

current = current.right

}

return current.val

}

search(val){

return this.searchNode(this.root,val)

}

searchNode(node,val){

if(node === null){

return false

}

if(this.compareFn(val,node.val) === Compare.less){

return this.searchNode(node.left,val)

}else if(this.compareFn(val,node.val) === Compare.bigger){

  

return this.searchNode(node.right,val)

}else{

return true

}

}

}

  

let myTree = new BST()

myTree.insert(100)

myTree.insert(110)

myTree.insert(80)

myTree.insert(90)

myTree.insert(70)

console.log(myTree)

myTree.inOrderMap((val) => {

console.log(val)

})

相关简单题

二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:

**输入:**root = [1,null,2,3]
输出:[1,3,2]

示例 2:

**输入:**root = []
输出:[]

示例 3:

**输入:**root = [1]
输出:[1]

var inorderTraversal = function(root) {
    const ans=[];
    const dfs=root=>{
        if(!root){
            return;
        }
        dfs(root.left);
        ans.push(root.val);
        dfs(root.right);
    }
    dfs(root);
    return ans;

};

二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

**输入:**root = [3,9,20,null,null,15,7]
**输出:**3

示例 2:

**输入:**root = [1,null,2]
**输出:**2

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100
    思路:节点不为空时则分别求左右子树的高度的最大值,同时加 1 表示当前节点的高度,返回该数值
var maxDepth = function(root) {

if(!root) {

return 0;

} else {

const left = maxDepth(root.left);

const right = maxDepth(root.right);

return Math.max(left, right) + 1;

}

  
  

};

翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例 1:

**输入:**root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

示例 2:

**输入:**root = [2,1,3]
输出:[2,3,1]

示例 3:

**输入:**root = []
输出:[]

var invertTree = function(root) {

  

if (root === null) {

return null;

}

const left = invertTree(root.left);

const right = invertTree(root.right);

root.left = right;

root.right = left;

return root;

  

};

对称二叉树

  1. 对称二叉树
    给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

**输入:**root = [1,2,2,3,4,4,3]
**输出:**true

示例 2:

**输入:**root = [1,2,2,null,3,null,3]
**输出:**false


var isSymmetric = function (root) {
    function compare(a, b) {
        if (!a && b || !b && a) return false
        if (!a && !b) return true
        if (b.val !== a.val) return false

        // 下面是两个节点相等的情况,继续比较子节点

        // 将a代码左侧与b代码右侧比较
        const out = compare(a.left, b.right)
        // 将a代码右侧与b代码左侧比较
        const int = compare(a.right, b.left)
        return out && int
    }
    return compare(root.left, root.right)
};

二叉树的直径

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

示例 1:

**输入:**root = [1,2,3,4,5]
**输出:**3
**解释:**3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:
**输入:**root = [1,2]
**输出:**1
思路:最长直径就是最深的左子树加上最深的右子树

var diameterOfBinaryTree = function (root) {

let ans = 0

const dfs = (root) => {

if (!root) return 0

let l = dfs(root.left)

let r = dfs(root.right)

ans = Math.max(ans, l + r)

return Math.max(l, r) + 1

}

dfs(root)

return ans

};

将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 
平衡
 二叉搜索树。

示例 1:

**输入:**nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

**输入:**nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
思路:根据二叉搜索树的特点 使用dfs

var sortedArrayToBST = function(nums) {

const dfs = (nums) => {

if (nums.length === 0) return null
// 这段代码将数组 nums 的长度除以 2 得到的结果进行向下取整
let mid = (nums.length / 2) >> 0

const root = new TreeNode(nums[mid])

root.left = dfs(nums.slice(0, mid))

root.right = dfs(nums.slice(mid + 1))

return root

}

return dfs(nums)

  
};

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

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

相关文章

LVM、磁盘配额

LVM与磁盘配额 一、LVM LVM(逻辑卷管理)&#xff1a;是Linux系统下对硬盘分区的管理机制。 LVM机制适合于管理管理大存储设备。可以动态对硬盘进行扩容。 逻辑上的磁盘&#xff0c;概念上的磁盘&#xff0c;文件系统创建之后不考虑底层的物理磁盘。 若干个磁盘分区或者物理…

51 html网页

上节内容的网页是hello world的字符串&#xff0c;但实际上网页应该是html格式的这种超文本标记语言&#xff0c;这一节完善一下网页的各种格式和内容 分文件 实际服务器中&#xff0c;网页的界面应该单独放一个文件&#xff0c;服务器从文件里读取网页的内容 先创建一个wroo…

PLC集成BL121PO网关优化智能电网的远程管理PLC转OPC UA协议

随着工业自动化技术的不断发展&#xff0c;智能电网等复杂系统对于设备之间高效通信的需求日益增加。PLC转OPC UA协议转换网关BL121PO作为一款领先的协议转换设备&#xff0c;通过其独特的设计和功能&#xff0c;为用户提供了高效、安全的PLC接入OPC UA的解决方案。 设备概述 …

R语言入门 | 使用 dplyr 进行数据转换

3.1简介 3.1.1准备工作 3.1.2 dplyr 基础 • 按值筛选观测&#xff08; filter() &#xff09;。 • 对行进行重新排序&#xff08; arrange() &#xff09;。 • 按名称选取变量&#xff08; select() &#xff09;。 • 使用现有变量的函数创建新变量&#xff08; …

STM32实验之USART串口发送+接受数据(二进制/HEX/文本)

涉及三个实验&#xff1a; 1.USART串口发送和接收数据 我们使用的是将串口封装成为一个Serial.c模块.其中包含了 void Serial_Init(void);//串口初始化 void Serial_SendByte(uint8_t Byte);//串口发送一个字节 void Serial_SendArray(uint8_t *Array,uint16_t Length);//…

Vue3项目练习详细步骤(第三部分:文章分类页面模块)

文章分类列表 主体结构 接口文档 文章分类列表查询接口数据绑定 Pinia状态管理库 axios请求拦截器 Pinia持久化插件-persist 未登录统一处理 添加文章分类 主体结构 接口文档 绑定请求数据 编辑文章分类 弹框结构 数据回显 接口文档 绑定请求数据 删除分类 …

WAF几种代理模式详解

WAF简介 WAF的具体作用就是检测web应用中特定的应用&#xff0c;针对web应用的漏洞进行安全防护&#xff0c;阻止如SQL注入&#xff0c;XSS&#xff0c;跨脚本网站攻击等 正向代理 WAF和客户端与网络资源服务器都建立连接&#xff0c;但是WAF 的工作口具有自己的 IP 地址&…

【408真题】2009-28

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

智慧排水监测系统方案

智慧排水监测系统方案 智慧排水监测系统作为现代城市基础设施管理的重要组成部分&#xff0c;旨在通过先进的信息技术手段&#xff0c;实现对城市排水系统的全面、实时、高效的远程监控与管理。该系统整合了物联网技术、大数据分析、云计算平台与人工智能算法&#xff0c;不仅…

国产操作系统上apt命令详解 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上apt命令详解 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上使用apt命令的详解文章。apt&#xff08;Advanced Package Tool&#xff09;是Debian及其衍生发行版&#xff08;如统信UOS…

Adobe Camera Raw 11 for Mac/win:摄影后期处理的革命性飞跃

在数字摄影的世界里&#xff0c;RAW格式以其未压缩的原始数据特性&#xff0c;为摄影师提供了更大的后期处理空间。而Adobe Camera Raw 11&#xff0c;作为这一领域的翘楚&#xff0c;以其卓越的性能和创新的功能&#xff0c;为摄影师们带来了前所未有的创作体验。 Adobe Came…

深度学习(一)

深度学习&#xff08;一&#xff09; 一、实验目的 掌握前馈全连接神经网络&#xff0c;具体包括&#xff1a; (1) 前馈全连接神经网络的网络结构 (2) 前馈神全连接经网络的工作原理 (3) 前馈全连接神经网络的代码实现 二、实验内容 1. 导入常用工具包 2. 数据导入与数据…

国内加密软件排行榜,每一款加密软件都是精品

在数字化快速发展的今天&#xff0c;数据安全和隐私保护已成为企业和个人关注的焦点。加密软件作为保护数据安全的重要手段&#xff0c;其重要性日益凸显。以下是根据权威机构的评测和用户反馈&#xff0c;整理的国内加密软件排行榜及其特点概述。 1、加密软件安企神免费试用7天…

计算机系统基础实验三(解了但尽量理解)

一.准备阶段 1、下载好32位的实验代码后&#xff0c;将文件解压缩并且通过共享文件夹操作将文件添加到虚拟机中&#xff0c;双击查看bomb.c代码&#xff0c;将c代码完整看了一遍&#xff0c;发现看这里的c代码是无从下手的&#xff0c;代码中只含有主函数&#xff0c;触发炸弹…

前缀和(下)

目录 热身&#xff1a; 寻找数组的中心下标 题解&#xff1a; 代码&#xff1a; 进阶&#xff1a; 除自身之外数组的乘积 题解&#xff1a; 代码&#xff1a; 和为K的子数组 题解&#xff1a; 代码&#xff1a; 和可被 K 整除的子数组 题解&#xff1a; 同余定理…

【网络运维的重要性】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

基于单片机的步进电机控制系统研究

摘 要 &#xff1a; 近年来 &#xff0c; 步进电机凭借其定位精度高 、 使用方便 、 性价比高 、 容易控制等优点 &#xff0c; 在各领域受到广泛应用 。 文中利用C52 单片机设计了一种步进电机控制系统 &#xff0c; 介绍了其总体方案 、 主控制模块 、 驱动电路 、 键盘 、 晶…

jmeter多用户并发登录教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录操作&#xff0c;大致参考如下 jmx脚本&#xff1a;百度网盘链接 提取码&#xff1a;0000 一&#xff1a; 单用户登录 先使用1个用户登录&#xff08;先把1个请求调试通过&#xff09; 发送一个登录请求&…

【Python】解决Python报错:TypeError: ‘int‘ object is not iterable

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

打造云计算时代的仿真软件

2024年5月25日&#xff0c;北京云道智造科技有限公司&#xff08;下称“云道智造”&#xff09;在深圳成功举办了2024新品发布会暨用户大会。来自全国各地的近500位客户和合作伙伴代表齐聚一堂&#xff0c;共同见证了云道智造新产品的隆重发布&#xff0c;交流分享了仿真领域的…