当前位置: 首页 > news >正文

【JavaScript】LeetCode:51-55

文章目录

  • 51 验证二叉搜索树
  • 52 二叉搜索树中第k小的元素
  • 53 二叉树的右视图
  • 54 二叉树展开为链表
  • 55 从前序与中序遍历序列构造二叉树

51 验证二叉搜索树

在这里插入图片描述

  • 递归
  • 对二叉搜索树进行中序遍历,输出节点的值是单调递增的。
  • 方法1:对二叉树进行中序遍历,将节点的值放入数组中,判断数组是否单调递增(双指针)。
  • 方法2:maxval记录前一个节点的数值,初始化为一个绩效的值。
  • 方法3:新建节点pre,pre指向前一个结点,初始化为null。这里给出方法3的代码。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {boolean}*/
var isValidBST = function(root) {let pre = new TreeNode();pre = null;var isValid = function(root) {if(root == null){ // 空树也是二叉搜索树return true;}let left = isValid(root.left);if(pre != null && pre.val >= root.val){return false;}pre = root;let right = isValid(root.right);return left && right;}return isValid(root);
};

52 二叉搜索树中第k小的元素

在这里插入图片描述

  • 递归
  • 求中序遍历的第k个节点。
  • 对二叉搜索树进行中序遍历,遍历到第k个节点时,记录结果res,记录结果后返回。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @param {number} k* @return {number}*/
var kthSmallest = function(root, k) {var traversal = function(root){if(root == null){return;}traversal(root.left);if(k == 0){return;}if(--k == 0){res = root.val;}traversal(root.right);}let res = 0;traversal(root);return res;
};

53 二叉树的右视图

在这里插入图片描述

  • 递归
  • 先递归右子树,再递归左子树。
  • 每层设置一个深度deep,遍历过程中,若该节点对应层的deep首次访问,则将该节点存入右视图结果数组中。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {number[]}*/
var rightSideView = function(root) {var traversal = function(root, deep){if(root == null){return;}if(deep == res.length){res.push(root.val);}traversal(root.right, deep + 1);traversal(root.left, deep + 1);}let deep = 0;let res = [];traversal(root, deep);return res;
};

54 二叉树展开为链表

在这里插入图片描述

  • 递归
  • 使用"倒"中序遍历,即右 -> 左 -> 中,遍历结果(654321)中的第一个节点就是链表的最后一个节点(6)。
  • 新建pre作为前一个结点,初始化为null,随着"倒"中序遍历不断为其赋值为前一个结点。
  • 除了最后一个节点的左节点不为null外,其他节点的左节点都为null,右节点都为pre。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {void} Do not return anything, modify root in-place instead.*/
var flatten = function(root) {var traversal = function(root){if(root == null){return;}traversal(root.right);traversal(root.left);if(pre != null){root.right = pre;root.left = null;}pre = root;}let pre = new TreeNode();pre = null;traversal(root);return root;
};

55 从前序与中序遍历序列构造二叉树

在这里插入图片描述

  • 递归
  • 前序数组的第一个元素为节点元素,在中序数组中寻找该元素作为分割点index,分割出左中序数组和右中序数组。
  • index可以理解为,在中序数组中,索引为index的位置前有index个元素,而左前序数组和左中序数组的length应该相等(右同理),因此可以借助index分割前序数组。
  • 根据index分割前序数组,得到左前序数组和右前序数组。
  • 叶子节点直接返回该节点,不必将左、右节点设置为null。
  • 将左前序数组和右中序遍历继续遍历,右前序数组和右中序数组继续遍历。
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {number[]} preorder* @param {number[]} inorder* @return {TreeNode}*/
var buildTree = function(preorder, inorder) {var traversal = function(preorder, inorder){if(preorder.length == 0){return null;}let nodevalue = preorder[0];let node = new TreeNode(nodevalue);if(preorder.length == 1){ // 叶子节点直接返回return node;}let index = inorder.findIndex(item => item == node.val);let inleft = inorder.slice(0, index);let inright = inorder.slice(index + 1, inorder.length);let preleft = preorder.slice(1, 1 + index);let preright = preorder.slice(1 + index, preorder.length);node.left = buildTree(preleft, inleft);node.right = buildTree(preright, inright);return node;        }return traversal(preorder, inorder);
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue实战教程:手动封装一个全局可自定义图标提示组件
  • 企业如何高效应对多类型知识产权事务的复杂挑战?
  • Vue中集中常见的布局方式
  • 1.分页查询(后端)—— Vue3 + SpringCloud 5 + MyBatisPlus + MySQL 项目系列(基于 Zulu 11)
  • MySQL事务、视图、索引、恢复、备份、导入导出的学习
  • 代码随想录打卡Day41
  • 研一奖学金计划2024/9/23有感
  • 【ARM】armv8的虚拟化深度解读
  • 神经网络激活函数
  • API代理是什么?解读其原理与作用
  • 累加求和-C语言
  • [大语言模型-论文精读] Diffusion Model技术-通过时间和空间组合扩散模型生成复杂的3D人物动作
  • 大模型prompt先关
  • 【网络安全】密码学的新进展
  • 大模型之基准测试集(Benchmark)-给通义千问2.0做测评的10个权威测基准测评集
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【React系列】如何构建React应用程序
  • 0x05 Python数据分析,Anaconda八斩刀
  • Java编程基础24——递归练习
  • Java面向对象及其三大特征
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • PV统计优化设计
  • SAP云平台里Global Account和Sub Account的关系
  • springMvc学习笔记(2)
  • SwizzleMethod 黑魔法
  • Twitter赢在开放,三年创造奇迹
  • vue-cli3搭建项目
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue总结
  • 初探 Vue 生命周期和钩子函数
  • 关于for循环的简单归纳
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 码农张的Bug人生 - 见面之礼
  • 学习Vue.js的五个小例子
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 正则表达式
  • 最近的计划
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​​​​​​​​​​​​​​Γ函数
  • ​​​【收录 Hello 算法】9.4 小结
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (C++)八皇后问题
  • (C语言)二分查找 超详细
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)Java算法:二分查找
  • (一)WLAN定义和基本架构转
  • ****三次握手和四次挥手
  • .Net Core 中间件与过滤器
  • .Net 访问电子邮箱-LumiSoft.Net,好用