前端leetcde算法面试套路之二叉树

Zynq AXI DMA实战:5分钟搞懂S_AXIS_S2MM和M_AXIS_MM2S数据流(附Vivado配置截图) 本文通过Vivado实战配置,清晰解析了Zynq平台AXI DMA IP核中S_AXIS_S2MM和M_AXIS_MM2S数据流的核心概念与连接方法。文章重点阐述了数据流向、主从关系及接口命名规则,并提供了从ADC数据采集到DDR存储,再从DDR读取数据发送至DAC的完整双向数据流搭建指南,帮助工程师快速避坑。 阅读详情

前端就该用JS写算法 – 树 – 简单的那 30%

这里优先选择了 LeetCode 热题 HOT 100 中的树题,毕竟刷题的边际收益就是冲击需要算法的面试,所以 Hot 优先级更高。

二叉树的遍历

递归遍历

  1. 递归的时候前中后序都能直接处理完了
  2. 递归是前中后序遍历最简单也是最容易出理解的方法,不懂的画个图就好了

迭代遍历 – 双色标记法

  1. 使用颜色标记节点状态,新节点为白色,已经访问的节点为灰色 – 可以用数字或者其他任意标签标示
  2. 如果遇到的节点是白色,则标记为灰色,然后将右节点,自身,左节点一次入栈 – 中序遍历
  3. 如果遇到的节点是灰色的,则将节点输出
  4. 注意这里是用 stack 栈来存储的,所以是后进先出,所以如果是中序遍历,左 - 中 - 右 ,那么在插入栈的时候要反过来 右 - 中 - 左

按照那个男人的指示,正常我们就用递归做就好,就好像我们做非排序题排序的时候,sort 一下就好了,但是一旦面试官问到用另外的迭代方式的时候,我们再套个模板,会比记住多个迭代写法要简单,毕竟内存容量有限,而后续遍历的迭代写法确实挺坑的,能省一点内存就省一点吧

144. 二叉树的前序遍历

// 144. 二叉树的前序遍历

/** * @分析 -- 递归 */
var preorderTraversal = function (root) {
  const ret = [];
  const recursion = (root) => {
    if (!root) return;
    ret.push(root.val);
    recursion(root.left);
    recursion(root.right);
  };
  recursion(root);
  return ret;
};

/** * @分析 -- 迭代 -- 双色标记法 * 1. 使用颜色标记节点状态,新节点为白色,已经访问的节点为灰色 -- 可以用数字或者其他任意标签标示 * 2. 如果遇到的节点是白色,则标记为灰色,然后将右节点,自身,左节点一次入栈 -- 中序遍历 * 3. 如果遇到的节点是灰色的,则将节点输出 * 4. 注意这里是用 stack 栈来存储的,所以是后进先出,这里是前序遍历,中 - 左  - 右 ,那么在插入栈的时候要反过来 右 - 左 - 中 */
var preorderTraversal = function (root) {
  const ret = [];
  const stack = [];
  stack.push([root, 0]); // 0 是白色未处理的,1 是灰色处理过的
  while (stack.length) {
    const [root, color] = stack.pop();
    if (root) {
      if (color === 0) {
        // 遇到白球,则插入 -- 前序
        stack.push([root.right, 0]);
        stack.push([root.left, 0]);
        stack.push([root, 1]);
      } else {
        // 遇到灰球,则收网
        ret.push(root.val);
      }
    }
  }
  return ret;
};


参考视频:传送门

1.94 二叉树的中序遍历

// 94. 二叉树的中序遍历

/** * @分析 * 1. 递归的时候前中后序都能直接处理完了 * 2. 递归是前中后序遍历最简单也是最容易出理解的方法,不懂的画个图就好了 */
var inorderTraversal = function(root) {
    const ret  = []
    const recursion = root => {
        if(!root) return
        recursion(root.left)
        // 这里是中序,所以在两个递归之间,如果是前序就在前面,后序就在后面
        ret.push(root.val)
        recursion(root.right)
    }
    recursion(root)
    return ret
};

/** * @分析 -- 迭代 -- 双色标记法 * 1. 使用颜色标记节点状态,新节点为白色,已经访问的节点为灰色 -- 可以用数字或者其他任意标签标示 * 2. 如果遇到的节点是白色,则标记为灰色,然后将右节点,自身,左节点一次入栈 -- 中序遍历 * 3. 如果遇到的节点是灰色的,则将节点输出 * 4. 注意这里是用 stack 栈来存储的,所以是后进先出,所以如果是中序遍历,左 - 中 - 右 ,那么在插入栈的时候要反过来 右 - 中 - 左 */
var inorderTraversal = function(root) {
    const ret  = []
    const stack = []
    stack.push([root,0]) // 0 是白色未处理的,1 是灰色处理过的
    while(stack.length) {
        const  [root,color] = stack.pop()
        if(root){
            if(color === 0){
                // 遇到白球,则插入 -- 中序遍历
                stack.push([root.right,0])
                stack.push([root,1])
                stack.push([root.left,0])
            }else{
                // 遇到灰球,则收网
                ret.push(root.val)
            }
        } 
    }
    return ret
};

145. 二叉树的后序遍历

// 145. 二叉树的后序遍历

/** * @分析 -- 递归 */
var postorderTraversal = function(root) {
    const ret = []
    const dfs = (root) => {
        if(!root) return 
        dfs(root.left)
        dfs(root.right)
        ret.push(root.val)
    }
    dfs(root)
    return ret
};

/** * @分析 -- 迭代 -- 双色球 */
var postorderTraversal = function(root) {
    const ret = []
    const stack = []
    stack.push([root,0])
    while(stack.length){
        const [root,color] = stack.pop()
        if(root) {
            if(color === 0){
                stack.push([root,1])
                stack.push([root.right,0])
                stack.push([root.left,0])
            }else{
                ret.push(root.val)
            }
        } 
    }
    return ret
}

101. 对称二叉树

分析

  1. 对称二叉树,其实是要求是否镜像对齐,所以递归过程至少需要两个根节点,然后 dfs 主要就是判断是否是对称的两棵树
  2. 这里是自顶向下分配相互比较的子树节点 left 和 right,然后再自底向上的返回最终结果
  3. 在某一次dfs中,如果比较双方都是 null,那么证明比较双方是对称的;如果出现只有一方有值,或者双方有值但是值不一样的时候,返回false;
  4. 每次递归都是左右外层构成比较,左右内层构成比较
  5. 时间复杂度: O(h), 其中 h 是树的高度
// 101. 对称二叉树

var isSymmetric = function (root) {
  if (!root) return false;
  const dfs = (left, right) => {
    if (!left && !right) return true;
    if (!left || !right || left.val !== right.val) return false;
    return dfs(left.left, right.right) && dfs(left.right, right.left);
  };
  return dfs(root.left, root.right);
};

104. 二叉树的最大深度

  • 使用树的三种搜索方式,层序,自顶向下的dfs,自底向上的递归dfs

层序遍历

  1. 无论是深度,层数等,直接用层序遍历找到最后一层的最后一个叶子节点即可
  2. 时间复杂度 O(N), 空间复杂度 O(K) – K 是最大宽度
// 104. 二叉树的最大深度

/** * 1.无论是深度,层数等,直接用层序遍历找到最后一层的最后一个叶子节点即可 */

 var maxDepth = function(root) {
    if(!root) return 0
    let ret = 0
    const queue = []
    queue.push(root)
    while(queue.length){
        ret++ // 进入一层
        let len = queue.length
        while(len--){
            // 层序遍历
            const root = queue.shift()
            if(root.left) queue.push(root.left)
            if(root.right) queue.push(root.right)
        }
    }
    return ret
}

dfs – 自顶向下

  1. 我们在计算层数的时候,可以考虑到,没遍历一层,就携带一个参数,这个参数是一个标记,比方这里就是深度 depth
  2. 这样当我们遍历到叶子节点的时候,都可以和最大值比对一下,然后结束这一条路线
  3. 时间复杂度 O(N), 空间复杂度 O(D) – D 是深度
/** * 1. 自顶向上,带个层数参数,判定为叶子节点就进行最大值判断 */
var maxDepth = function (root) {
    if(!root) return 0
  let ret = 0;
  const dfs = (root, depth) => {
    if (root.left) dfs(root.left, depth + 1);
    if (root.right) dfs(root.right, depth + 1);
    // 走到这的时候,证明是叶子节点了,所以取最大值,就结束这一次的
    ret = Math.max(ret, depth);
  };
  dfs(root, 1);
  return ret;
};

递归 – 自低向上

  • 既然有自顶向下,那么当然就有自低向上了;
  • 就我浅薄的算法能力而已,自顶向下就是带参数的深度优先遍历 DFS, 而自低向上,是递归,需要dfs 到了底部,然后归到根节点,所以这里用的是 recursion 作为方法名。
  • 自顶向下是从根节点开始算一层深度,然后跑到叶子节点结束;自低向上反过来,跑到最底层,然后不断求叶子结点的最大深度,然加上自身返回到上层
  • 时间复杂度 O(N), 空间复杂度 O(1)
// 自低向上
var maxDepth = function (root) {
  const recursion = (root) => {
    // 只是到了底部,所以高度为 0
    if (!root) return 0;
    // 每一个节点的高度是多少,就是两个节点树的最大高度+自己所处的这一层1
    return Math.max(recursion(root.left), recursion(root.right))+1;
  };
  return recursion(root);
};


226. 翻转二叉树

自底向上

  • 因为要求的是反转二叉树,对于任意一颗子树,其实都是要做一样的操作,所以可以先递到叶子节点,然后开始进行翻转
  • 自底向上将翻转好的子树传递到上层的节点,直到最后的根节点,得到了两课翻转好的树,然后交换一下一下位置就好了
  • 时间复杂度 O(N)
// 226. 翻转二叉树
var invertTree = function (root) {
  const dfs = (root) => {
    // 到达了最底部,直接返回 null
    if (!root) return null;
    // 1.递归获取翻转后的左右子树
    const left = dfs(root.left)
    const right = dfs(root.right)
    // 2.反转两棵树的位置
    root.left = right
    root.right = left
    // 最后返回这个反转之后的树
    return root;
  };
  return dfs(root);
};

使用 SAP 自家的 AI 工具 Joule 辅助 SAP Fiori 应用开发 SAP Joule 不请自答,解释说标记了接口的 UI Component,具备进行异步内容创建的能力,比如其通过 rootView 分配的视图,在运行时可以异步创建。目前 SAP Business Application Studio 里的 SAP Joule 支持下面这八种上下文,绝大部分都和 SAP UI5 开发相关,剩下的则是代码仓库和 SAP 帮助文档的搜索。SAP Joule 回答的大意是:我只负责回答 SAP UI5 开发相关的问题,不要和我扯其他有的没的。 阅读详情

相关推荐

PCB印刷电路缺陷检测实战:从数据集准备到模型训练全流程解析

本文详细解析了PCB缺陷检测从数据集准备到模型训练的全流程。重点介绍了PKU-Market-PCB数据集的特点与下载方法,并提供了数据格式转换、模型选择(如YOLOv8)与训练配置的实战代码。针对PCB小目标检测的难点,文章给出了数据分析和模型优化的具体策略,帮助读者构建高效的缺陷检测系统。

weixin_29065791的博客 547

前端面试的数据结构与算法

前端面试的数据结构与算法面试大厂时会问的数据结构与算法数据结构(二叉树)1.找出二叉树中节点值的和等于固定值的路径2.深度优先遍历与广度优先遍历2-1 深度优先遍历2-2 广度优先遍历算法1.时间复杂度2.判断数组中是否满足有其中一项等于其它两项之和;3.栈和队列4.斐波那契数列总结 面试大厂时会问的数据结构与算法 数据结构(二叉树) 首先来了解一下什么是二叉树(Binary tree),它是树形结构的一个重要类型,二叉树的存储结构及其算法都较为简单,二叉树特点是每个结点最多只能有两棵子树,且有左右之分,一

weixin_42682011的博客 3489

用友YonSuite产品实操手把手教学(图文版)

用友YonSuite

ct341688的博客 8168

二叉树总结 —— 前端面试考点

全面总结二叉树面试考点

Celine921的博客 1031

别再死磕RD算法了!用MATLAB手把手复现SAR后向投影(BP)成像(附完整代码与避坑点)

本文详细介绍了如何使用MATLAB实现合成孔径雷达(SAR)后向投影(BP)成像算法,突破传统RD算法在大斜视和复杂轨迹场景中的局限。通过完整的代码示例和避坑指南,帮助读者掌握BP算法的核心原理、内存优化策略和并行计算技巧,提升SAR成像精度与效率。

weixin_30908103的博客 298

Android SSL证书固定实战:原理、方案与避坑指南

SSL/TLS协议是保障网络通信安全的基石,其核心原理是通过非对称加密和数字证书实现身份认证与数据加密。在移动应用开发中,为了防止中间人攻击,证书固定技术应运而生,它通过将服务器证书或公钥的哈希值预置在应用内,强制校验服务器身份,从而大幅提升通信链路的安全性。这一技术对于金融、电商等高安全要求场景尤为重要。本文聚焦Android平台,深入解析SPKI固定、Network Security Configuration与OkHttp CertificatePinner等主流方案,并针对证书更新、调试兼容等常见痛

weixin_33935636的博客 403

前端二叉树面试题

文章目录二叉树常见题型二叉树的中序遍历前序遍历后序遍历重建二叉树对称的二叉树 二叉树 二叉树是树结构中一种典型的树状结构,每个节点最多只能有两个子节点,一个是左侧子节点,一个是右侧子节点。 二叉树中又有一种比较典型的结构,称为二叉搜索树(BST),它允许左侧节点存储的值比父节点小,右侧存储的值比父节点大(或相等)。 常见题型 二叉树的中序遍历 给定一个二叉树,返回它的中序遍历 //递归实现 var inorderTraversal = function(root, array=[]){ if

simon的博客 2166

1、Ovirt 开源虚拟化平台安装

Ovirt虚拟化Node和Engine安装

大鱼 6266

一篇文章搞定面试中的二叉树

2018-02-07 IOExceptioner 算法与数据结构 来自:杨守乐(微信号:study_tech) 作者:IOExceptioner 链接:https://www.jianshu.com/p/0190985635eb 在上一篇介绍二叉树( Android面试题算法之二叉树 、红黑树详细分析,看了都说好),没看的读者建议先去了解了解,接下来再给

gongpulin的博客 510

斯坦福大学3D点云模型下载

本文整理了斯坦福大学10个经典的点云(pcd)及其模型(ply),方便日后使用,欢迎免费下载!

孙悟空 7733

基于Mask-RCNN网络的书架图书书脊分割和检测(含代码)

图书馆的书架上的图书书脊分割/检测对于图书书名等信息的识别具有重要意义,因此,该博客基于Mask-RCNN网络实现了图书书脊的分割和检测,有利于进一步利用ocr文字识别技术实现图书书名等信息的入库。如下图所示,为书架原始数据和分割/检测后的结果。(本文已训练模型,无需训练)

qq_44619530的博客 2025

一篇文章搞定面试中的二叉树题目

一篇文章搞定面试中的二叉树

dashenYangHJ的博客 1069

uniapp(安卓苹果APP端):解决video组件播放视频卡顿,视频一直加载非常缓慢或加载不出来解决方案,解决多个video组件视频播放很卡一直加载非常慢怎么办(无论真机调试还是本地测试都完美搞定)

uni-app APP端video组件播放视频卡顿,uniapp video app 加载不出来解决方案,uniapp app使用video视频播放卡顿,uni-app APP端video组件播放视频卡顿_uniapp video老是加载,uniapp开发app视频在真机上卡顿,安卓app播放视频很卡,苹果ios真机运行播放视频加载很慢怎么办,解决UniApp中MP4视频播放卡顿问题,解决m3u8视频播放很卡的问题,uniapp 使用video组件,部分视频加载非常慢,uniapp视频播放卡顿,安卓视频播放

✅ 精选推荐文章 7915

前端leetcde算法面试套路之树

按照那个男人的指示,正常我们就用递归做就好,就好像我们做非排序题排序的时候,sort 一下就好了,但是一旦面试官问到用另外的迭代方式的时候,我们再套个模板,会比记住多个迭代写法要简单,毕竟内存容量有限,而后续遍历的迭代写法确实挺坑的,能省一点内存就省一点吧。要知道做前端的面试算法,考的不就是你有么得主动学习能力,抽象能力等,但是考虑到参差不齐的前端娱乐圈,考得难吧可能就全是漏网之鱼了,所以既要筛选出鱼,但是又不能难度过大,树就是那个比较适中的,所以赶紧刷起来吧朋友们;有的时候我们直接判断是否叶子节点,

js2030code的博客 411

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

前端面试算法集合

问题1:给定一个数组a和一个长度值l,生成一个指定长度值为l的新数组b,要求b中的每一个元素都是从a中随机获取的,且数组元素不可重复。 function generate(a,l){ if(a.length < l) return '老数组长度不足!'; /*a长度可能超出,可以生成新数组后截取长度为l的赋值给b,也可以生成为l的b(这里选第二种)*/ var i=0, tmp=[], ...

L_SS133的博客 1173

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[前端面试]实战LeetCode - 前端面试必备二叉树算法

https://mp.weixin.qq.com/s/auLUlisGahUQQ1xL43-RVw

iChangebaobao的博客 655

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

前端面试题目整理——实现平衡二叉树AVL

AVL是BST的升级版,搜索性能更高。 function Node(key) { this.data = key this.left = null this.right = null } function AVL(arr) { this.root = null this.createAVL(arr) } AVL.prototype.createAVL = f...

Astar的博客 703

【前端面试】前端面试题300道~~熬夜吐血整理

人生也有涯 而知也无涯 以有涯随无涯 殆已! –庄子 部分内容转载自网络,侵立删!如有错误,请指正! 1、手写jsonp的实现 参考自: http://www.qdfuns.com/notes/16738/1b6ad6125747d28592a53a960b44c6f4.html 先说说JSONP是怎么产生的: 其实网上关于JSON...

前端之路 19万+

别再翻了,面试二叉树看这 11 个就够了~

写在前边 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找。面试吃了亏之后,我就慢慢的做出总结,开始分类的把数据结构所有的题型和解题思路每周刷题做出的系统性总结写在了 Github...

小鹿动画学编程 12万+

前端常见算法面试题之 - 重建二叉树[JavaScript解法]

前端常见算法面试题之 - 重建二叉树[JavaScript解法]题目描述实现思路代码实现 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列[1,2,4,7,3,5,6,8],和中序遍历序列[4,7,2,1,5,3,8,6],则重建二叉树并返回 实现思路 根据前序遍历和中序遍历的定义,我们不难发先输入数据可...

吴潇雄的博客 1789
上一篇: 前端leetcde算法面试套路之树
下一篇: 前端leetcde算法面试套路之堆
js2030code
博客等级 码龄4年 4粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值