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

news2024/11/8 23:42:35

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

二叉树

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

二叉搜索树

二叉搜索树(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)

  
};

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

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

相关文章

扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第74讲。 扎气球最高分&…

IntelliJ IDEA内置自带Maven的使用注意事项

一、内置自带Maven的位置 IDEA中是有自带Maven的,虽然可能不够个性化,不太好用,但是如果知道怎么设置,还是能自定义一点的。它作为IDEA的自带插件,位置在IDEA所在目录的“\plugins\plugins\maven\lib\maven3\”文件夹中。 二、本地仓库位置 因为Maven主要功能就是统一下…

MoE模型大火,源2.0-M32诠释“三个臭皮匠,顶个诸葛亮”!

文 | 智能相对论 作者 | 陈泊丞 近半年来&#xff0c;MoE混合专家大模型彻底是火了。 在海外&#xff0c;OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架构。而在国内&#xff0c;浪潮信息也刚刚发布了基于MoE架构的“源2.0-M3…

无人机操作界面来了,起点就很高呀。

无人机操作界面设计需要考虑以下几个方面&#xff1a; 易用性&#xff1a;无人机操作界面应该简单直观&#xff0c;易于操作和理解。操作按钮和控键应该布局合理&#xff0c;易于触摸或点击。重要的操作功能应该易于找到和使用&#xff0c;避免用户迷失或困惑。实时反馈&#…

【Uniapp微信小程序】自定义水印相机、微信小程序地点打卡相机

效果图 template 下方的image图片自行寻找替换! <template><view><camerav-if="!tempImagePath && cameraHeight !== 0":resolution="high":frame-size="large":device-position="device":flash="flas…

RAID配置实战

概念 raid磁盘阵列&#xff1a;可以用不同的硬盘分区&#xff0c;组成一个逻辑上的硬盘。具有高可用 raid级别&#xff1a; raid0 &#xff1a;条带化存储&#xff1a;数据分散在多个物理硬盘上的存储方式。利用多个磁盘并行读取和写入。存储性能和读写性能是最好的。没有冗…

朗读亭主要作用有哪些?

朗读亭的主要作用有以下几个方面&#xff1a; 1. 提供朗读服务&#xff1a;朗读亭是一个专门的场所&#xff0c;提供给人们朗读的环境和场地。人们可以在朗读亭中选择自己喜欢的书籍或文章&#xff0c;并通过朗读将其表达出来。这样可以帮助人们提高朗读能力&#xff0c;增强自…

【C语言训练题库】杨辉三角(下三角型和金字塔型)

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 题目&#xff1a;打印杨辉三角 1. 下三角型 1.1 图例: 1.2. 解析: 1.3. 代码: 1.4. 运行&#xff1a; 2. 金字塔型 2.1 图例 2.2. 解析 2.2.1. 打印金…

[猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送

[猫头虎分享21天微信小程序基础入门教程]第21天&#xff1a;小程序的社交分享与消息推送 第21天&#xff1a;小程序的社交分享与消息推送 &#x1f4f2; 自我介绍 大家好&#xff0c;我是猫头虎&#xff0c;一名全栈软件工程师。今天我们继续微信小程序的学习&#xff0c;重…

买入看跌期权怎么理解?

今天带你了解买入看跌期权怎么理解&#xff1f;看跌期权买入者往往预期市场价格将下跌。 买入看跌期权怎么理解&#xff1f; 买入看跌期权是指购买者支付权利金&#xff0c;获得以特定价格向期权出售者卖出一定数量的某种特定商品的权利。看跌期权买入者往往预期市场价格将下跌…

基于python实现生命游戏

文章目录 一、生命游戏是什么二、生命游戏规则解释1.相邻细胞2.细胞状态 三、代码实现1.邻居细胞2.更新状态 四、整体代码 一、生命游戏是什么 生命游戏&#xff08;Game of Life&#xff09;是由英国数学家约翰何顿康威在1970年发明的一种细胞自动机&#xff08;Cellular Aut…

备份服务器的安全风险以及如何通过TDE透明加密提升安全性

备份服务器的潜在安全风险主要包括以下几个方面&#xff1a; 1. 数据泄露风险&#xff1a; 备份数据可能包含敏感信息&#xff0c;如用户个人信息、商业机密等。如果备份数据未经适当保护&#xff0c;例如存储在不安全的位置或未加密&#xff0c;黑客或未授权的人员可能会获取…

家政预约小程序08服务详情

目录 1 创建页面2 创建URL参数3 配置数据详情组件4 从分类页跳转到详情页5 搭建详情页总结 现在我们的小程序已经在首页和分类页展示了服务的列表信息&#xff0c;当用户点击具体的内容的时候需要打开详情页&#xff0c;本篇介绍一下详情页的开发。 1 创建页面 打开应用编辑器…

【第7章】SpringBoot整合Mybatis-Plus

文章目录 前言一、引入库二、案例1.UserMapper2.UserController3. 结果 三、配置总结 前言 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 上一篇内容已经整合过Mybatis&#xff0c;这里在…

拼接字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用“”运算符可完成对多个字符串的拼接&#xff0c;“”运算符可以连接多个字符串并产生一个字符串对象。 例如&#xff0c;定义两个字符串&#…

05-28 周二 TTFT, ITL, TGS 计算过程以及LLama2推理代码调试过程

05-28 周二 LLama2推理代码调试过程 时间版本修改人描述2024年5月28日15:03:49V0.1宋全恒新建文档 简介 本文主要用于求解大模型推理过程中的几个指标&#xff1a; 主要是TTFT&#xff0c;ITL&#xff0c; TGS 代码片段 import osdata_dir "/workspace/models/" m…

【2024最新华为OD-C卷试题汇总】披萨大作战 (100分) - 支持在线评测+三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 文章目录 前…

从多站点到多活,XEOS 对象数据容灾能力再提升

近日&#xff0c; XSKY SDS V6.4 新版本发布&#xff0c;其中 XEOS V6.4 全新升级并完善了统一命名空间功能&#xff0c;更进一步增强和完善了异地容灾方案&#xff0c;配合强一致代理读&#xff0c;可以实现异地多活&#xff1b;同时大幅降低管理复杂度&#xff0c;有效降低容…

Apache漏洞复现:【CVE-2021-42013】【CVE_2021_41773】【CVE-2017-15715】

声明 严禁读者利用本文介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 ! 远程代码执行 CVE-2021-42013 描述 Apache HTTP Ser…

RFM模型-分析母婴类产品

1&#xff0c;场景描述 假设我们是某电商平台的数据分析师&#xff0c;负责分析母婴产品线的用户数据。母婴产品的购买行为具有一定的周期性和生命周期特征&#xff0c;如用户在不同怀孕阶段的需求不同&#xff0c;以及宝宝出生后的不同成长阶段需要不同的产品。 2&#xff0…