算法篇——二叉树大集合上篇(js版)

news2024/11/24 15:45:44

222.完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
链接:https://leetcode.cn/problems/count-complete-tree-nodes

var countNodes = function(root) {
    var res = [], queue = [];
    var sumLen = 0;
    if(!root) return 0;
    queue.push(root);
    while(queue.length) {
        let len = queue.length;
        let curNode = [];
        for(let i = 0;i < len; i++) {
            let node = queue.shift();
            curNode.push(node.val);
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        }
        res.push(curNode);
        sumLen += curNode.length;
    }
    return sumLen;
};

110.平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

var isBalanced = function(root) {
    return booleanisBalanced(root) != -1;
};
var booleanisBalanced = function(root) {
    if (!root) return 0;
    // 当某一子树不平衡就返回
    let left = booleanisBalanced(root.left);
    if (left == -1) return -1;
    let right = booleanisBalanced(root.right);
    if (right == -1) return -1;
    // 如果左右子树层高相差小于2  平衡:返回实际层高  否则返回-1
    return Math.abs(left - right) < 2 ? Math.max(left, right) + 1 : -1;
};

257. 二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

链接:力扣

var binaryTreePaths = function(root) {
    // 如果是空树
    if(!root) return [];
    var res = [], cur = '';
    pathNode(root, res, cur);
    return res;
};
var pathNode = (root, res, cur) => {
    if(!root) return;
    // 如果没有左右孩子,说明是叶子节点
    if(!root.left && !root.right) {
        // 在当前字符串上加上叶子结点
        cur += root.val;
        res.push(cur);
        return;
    }
    // 非叶子节点加 →
    else cur += root.val + '->';
    //递归左子树
    pathNode(root.left, res, cur);
    //递归右子树
    pathNode(root.right, res, cur);
}

404.左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

链接:力扣

// 迭代
var sumOfLeftLeaves = function(root) {
    if(!root) return null;
    var list = [root], sum = 0;
    while(list.length) {
        var cur = list.shift();
        // 左节点是叶子节点时
        if(cur.left && !cur.left.left && !cur.left.right) 
            sum += cur.left.val;
        // 遍历左右子树
        cur.left && list.push(cur.left);
        cur.right && list.push(cur.right);
    }
    return sum;
};

 或

// 递归
var sumOfLeftLeaves = function(root) {
    return sumNode(root);
};
var sumNode = (root) => {
    if(!root) return null;
    // 遍历左右子树
    var lval = sumNode(root.left);
    var rval = sumNode(root.right);
    // 单层递归
    var mid = 0;
    // 当前是左叶子节点
    if(root.left && !root.left.left && !root.left.right) mid += root.left.val;
    // 左子树的左叶子节点+右子树的左叶子节点
    var sum = mid + lval + rval;
    return sum;
}

513.找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

链接:力扣

var findBottomLeftValue = function(root) {
    var list = [root], res = 0;
    while(list.length) {
        var len = list.length;
        for(var i = 0; i < len; i++) {
            var cur = list.shift();
            if(i == 0) res = cur.val;
            cur.left && list.push(cur.left);
            cur.right && list.push(cur.right);
        }
    }
    return res;
};

112. 路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。
链接:https://leetcode.cn/problems/path-sum

  

var hasPathSum = function(root, targetSum) {
    var sum = 0;
    return pathSum(root, sum, targetSum);
};
var pathSum = (root, sum, targetSum) => {
    if(!root) return false;
    // 如果没有左右孩子,说明是叶子节点
    if(!root.left && !root.right) {
        // 在当前和上加上叶子结点的值为当前路径的sum
        sum += root.val;
        return sum == targetSum ? true : false;
    }
    // 非叶子节点只进行相加
    else sum += root.val;
    // 遍历左右子树
    return pathSum(root.left, sum, targetSum) || pathSum(root.right, sum, targetSum);  
}

106.从中序与后序遍历序列构造二叉树 

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
链接:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal

var buildTree = function(inorder, postorder) { 
    if(!inorder.length) return null;
    // 根节点是后序遍历的最后一个元素
    var rootVal = postorder[postorder.length-1];
    // 切割遍历数组的下标
    var index = inorder.indexOf(rootVal);
    // 中序左数组
    var midLeft = inorder.slice(0, index);
    // 中序右数组
    var midRight = inorder.slice(index+1, inorder.length);
    // 后序左数组
    var lastLeft = postorder.slice(0, index);
    // 后序右数组
    var lastRight = postorder.slice(index, postorder.length-1);
    // 创建二叉树
    var root = new TreeNode(rootVal);
    // 创建左子树
    root.left = buildTree(midLeft, lastLeft);
    // 创建右子树
    root.right = buildTree(midRight, lastRight);
    return root;
};

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

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal

  

var buildTree = function(preorder, inorder) {
    if(!inorder.length) return null;
    // 根节点是前序遍历的第一个元素
    var rootVal = preorder[0];
    // 切割遍历数组的下标
    var index = inorder.indexOf(rootVal);
    // 中序左数组
    var midLeft = inorder.slice(0, index);
    // 中序右数组
    var midRight = inorder.slice(index+1, inorder.length);
    // 前序左数组
    var preLeft = preorder.slice(1, midLeft.length+1);
    // 前序右数组
    var preRight = preorder.slice(midLeft.length+1, preorder.length);
    // 创建二叉树
    var root = new TreeNode(rootVal);
    // 创建左子树
    root.left = buildTree(preLeft, midLeft);
    // 创建右子树
    root.right = buildTree(preRight, midRight);
    return root;
};

654.最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
链接:https://leetcode.cn/problems/maximum-binary-tree

var constructMaximumBinaryTree = function(nums) {
    var root = maxVal(nums, 0, nums.length-1);
    return root;
};
var maxVal = (list, left, right) => {
    if(left > right) return null;
    let tarVal = -1, tarIndex = -1;
    for(var i = left; i <= right; ++i) {
        if(list[i] > tarVal) {
            tarVal = list[i];
            tarIndex = i;
        }
    }
    var root = new TreeNode(tarVal);
    root.left = maxVal(list, left, tarIndex-1);
    root.right = maxVal(list, tarIndex + 1, right);
    return root;
}

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

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

相关文章

AutoGPT的出现,会让程序员失业吗?

最近&#xff0c;一个叫AutoGPT的模型火了&#xff0c;在GitHub上线数周Star数就直线飙升。截至目前&#xff0c;AutoGPT的Star数已经达到87k&#xff0c;马上接近90k&#xff0c;超过了PyTorch的65k。 根据AutoGPT的命名&#xff0c;就可以发现其神奇之处在于“auto”&#x…

从申请到调用:全国快递物流查询 API 使用教程

引言 面对越来越多的快递需求和快递公司的日益增多&#xff0c;手动查询快递状态的工作变得愈发繁琐。此时&#xff0c;一个全国快递物流查询 API 的出现能够极大地提高查询的效率和准确性&#xff0c;解决人工查询的问题&#xff0c;为用户提供更加便捷的服务体验。全国快递物…

ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7

编辑&#xff1a;ll ASEMI代理ADG1408YRUZ-REEL7原装ADI车规级ADG1408YRUZ-REEL7 型号&#xff1a;ADG1408YRUZ-REEL7 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;TSSOP-16 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;16 类型&#…

tftp+Filezilla文件双向传输(1)-centos(VMware)-win10(host)

目录 1.下载安装vsftpdtftptftp-server 2.配置服务 2.1 配置服务 修改文件 /etc/vsftpd.conf 2.2 配置服务 守护进程 /etc/xinetd.d/tftp 2.3 配置服务 tftp服务器 2.4 配置登录用户 2.4.1 修改selinux 2.4.2 匿名用户登录 2.4.3 新建账户&#xff0c;不能登陆系…

使用API Monitor巧妙探测C++程序中监听2620端口的模块

目录 1、问题说明 2、API Monitor工具介绍 2.1、API Monitor主要用途 2.2、如何使用API Monitor工具 3、使用API Monitor监测程序对bind函数的调用&#xff0c;定位启用2620端口的模块 3.1、为啥要监控socket API函数bind 3.2、编写演示代码进行说明 3.3、使用API Moni…

[SpringBoot框架]如何使用SpringBoot框架

SpringBoot框架的好处 如果不使用SpringBoot框架创建工程&#xff0c;而是创建一个Maven空工程,&#xff0c;在工程里面引入其它框架的时候&#xff0c;比如SSM&#xff0c;需要在pom.xml配置文件中添加框架相关的依赖&#xff0c;并且个别的框架还需要配置文件&#xff0c;在配…

nodejs+vue+elementui钢琴乐器培训课程报名管理系统

1绪论 5 1.1项目研究的背景 5 1.2开发意义 5 1.3项目研究内容 5 2开发技术介绍 6 2.1 B/S架构 6 前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&…

TCP协议在IM场景中涉及核心问题以及解决方案梳理

1. TCP协议是一种可靠的协议&#xff0c;但是在实际应用中&#xff0c;仍然需要应用程序来处理一些细节&#xff0c;以确保数据能够按照预期的方式传输。一些业务可能需要在TCP层面之上实现自己的可靠性机制&#xff0c;例如在应用层实现消息确认机制&#xff0c;以确保每个消息…

Seata强一致性事务模式XA的设计理念

承接上文分布式事务Seata-AT模式 XA规范是什么? 是分布式事务处理DTP&#xff08;Distributed Transaction Processing&#xff09;的标准。是描述全局的事务管理器和局部的资源管理器之间的接口规范。允许多个资源&#xff08;如数据库、应用服务、消息队列&#xff09;在同…

WPF教程(七)--依赖属性(3)--附加属性

一、 只读依赖属性 以前在对于非WPF的功能来说&#xff0c;对于类的属性的封装中&#xff0c;经常会对那些希望暴露给外界只读操作的字段封装成只读属性&#xff0c;同样在WPF中也提供了只读属性的概念&#xff0c;如一些 WPF控件的依赖属性是只读的&#xff0c;它们经常用于报…

jsp+springboot基于ssm的人才招聘求职网站推荐模拟考试系统java idea

登录需要随机数字验证码 管理员&#xff1a; 招聘管理 求职信息管理 &#xff0c; 招聘信息管理 人员管理 管理注册的用户进行审核操作 公告管理 发布公告新闻 &#xff08;公告我想不到啥意思&#xff0c;可修改或增加别的&#xff09; 个人信息 修改个人信息 招聘者&am…

【沐风老师】3dMax填充地形网格插件使用方法详解

3dMax填充地形网格插件使用方法 3dMax填充地形网格插件&#xff0c;它从等高线或现有网格创建和优化地形曲面。基于四边形的输出允许更容易的后期重构&#xff0c;例如使用推/拉绘制。常规的面大小可以减少渲染问题&#xff08;GI、置换&#xff09;&#xff0c;并且可以在其上…

如何实现Windows RDP 远程桌面异地跨网连接

Windows RDP远程桌面的应用非常广泛。远程桌面协议(RDP)是一个多通道(multi-channel)的协议&#xff0c;让使用者(所在计算机称为用户端或本地计算机)连上提供微软终端机服务的计算机(称为服务端或远程计算机)。大部分的Windows版本都有用户端所需软件&#xff0c;有些其他操作…

【LeetCode】剑指 Offer 65. 不用加减乘除做加法 p310 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/ 1. 题目介绍&#xff08;65. 不用加减乘除做加法&#xff09; 写一个函数&#xff0c;求两个整数之和&#xff0c;要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算…

C语言入门篇——输入输出篇

目录 1、printf()函数 1.1、printf()函数中的标记 1.2、输出最小宽度&#xff08;width&#xff09; 1.3、精度&#xff08;.precision&#xff09; 2、scanf()函数 2.1、scanf(“输入控制符”, 输入参数) 2.2、scanf(“输入控制符非输入控制符”, 输入参数); 2.3、字符…

docker简单教程(二)启动服务,实现简单的网站

docker简单教程&#xff08;二&#xff09;启动服务 文章目录 docker简单教程&#xff08;二&#xff09;启动服务1&#xff1a;创建index.html2&#xff1a;创建Dockerfile3&#xff1a;构建4&#xff1a;启动5&#xff1a;访问6&#xff1a;下一篇将介绍一些常用的操作 这篇我…

Ae 脚本:TypeMonkey 动态文本动画

使用 TypeMonkey 脚本可以快速生成带有摄像机动画的动态文本 Kinetic text效果&#xff0c;简单快捷&#xff0c;无需繁琐的关键帧控制。 经典网络案例&#xff1a;倒鸭子 ◆ ◆ ◆ 使用方法 一般操作流程 新建合成&#xff0c;并确定好合成的持续时间。或者&#xff0c;设置…

句子改写神器-文案自动改写的免费软件

AI改写软件&#xff1a;让你的写作更加轻松高效 现代社会中&#xff0c;写作已经成为了我们各行各业必不可少的一部分。无论是文章、报道、论文还是其他各类文本&#xff0c;都需要花费大量的时间和精力来撰写。而且&#xff0c;在写作过程当中&#xff0c;我们还需要进行反复…

【Java】『蓝桥杯』10道编程题及答案(二)

系列文章 【Java】『蓝桥杯』10道编程题及答案&#xff08;一&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/130223115 【Java】『蓝桥杯』10道编程题及答案&#xff08;二&#xff09; 本文链接&#xff1a;https://blog.csdn.net/y…

Python 代码打造小 AI ,罗列博文笔记总索引列表,自动生成“我的博文笔记总索引”博文 HTML5 源码文本

Python 代码打造小 AI &#xff0c;获取笔记信息&#xff0c;自动阅读量降序编排索引列表&#xff0c;生成 HTML5 源码文本。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&…