训练营day17

news2024/10/5 16:20:55

110.平衡二叉树

力扣题目链接

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

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

110.平衡二叉树

 

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

110.平衡二叉树1

 返回 false 。

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

但leetcode中强调的深度和高度很明显是按照节点来计算的,如图:

110.平衡二叉树2

 

var isBalanced=function(root){
    if(root===null) return true;
    if(Math.abs(getHeight(root.left)-getHeight(root.right))>1) return false;
    return isBalanced(root.left)&&isBalanced(root.right);
}
var getHeight=function(root){
    if(root===null) return 0;
    return Math.max(getHeight(root.left),getHeight(root.right))+1;
}
// 代码随想录
// 递归法:
var isBalanced = function(root) {
    //还是用递归三部曲 + 后序遍历 左右中 当前左子树右子树高度相差大于1就返回-1
    // 1. 确定递归函数参数以及返回值
    const getDepth = function(node) {
        // 2. 确定递归函数终止条件
        if(node === null) return 0;
        // 3. 确定单层递归逻辑
        let leftDepth = getDepth(node.left); //左子树高度
        // 当判定左子树不为平衡二叉树时,即可直接返回-1
        if(leftDepth === -1) return -1;
        let rightDepth = getDepth(node.right); //右子树高度
        // 当判定右子树不为平衡二叉树时,即可直接返回-1
        if(rightDepth === -1) return -1;
        if(Math.abs(leftDepth - rightDepth) > 1) {
            return -1;
        } else {
            return 1 + Math.max(leftDepth, rightDepth);
        }
    }
    return !(getDepth(root) === -1);
};
// 迭代法:
// 获取当前节点的高度
//getHeight函数的作用是获取当前节点的高度
var getHeight = function (curNode) {
    let queue = [];
    if (curNode !== null) queue.push(curNode); // 压入当前元素
    let depth = 0, res = 0;
    while (queue.length) {
        let node = queue[queue.length - 1]; // 取出栈顶
        if (node !== null) {
            queue.pop();
            queue.push(node);   // 中
            queue.push(null);
            depth++;
            node.right && queue.push(node.right);   // 右
            node.left && queue.push(node.left);     // 左
        } else {
            queue.pop();
            node = queue[queue.length - 1];
            queue.pop();
            depth--;
        }
        res = res > depth ? res : depth;
    }
    return res;
}
var isBalanced = function (root) {
    if (root === null) return true;
    let queue = [root];
    while (queue.length) {
        let node = queue[queue.length - 1]; // 取出栈顶
        queue.pop();    
        if (Math.abs(getHeight(node.left) - getHeight(node.right)) > 1) {
            return false;
        }
        node.right && queue.push(node.right);
        node.left && queue.push(node.left);
    }
    return true;
};

257. 二叉树的所有路径

力扣题目链接(opens new window)

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

257.二叉树的所有路径1

 257.二叉树的所有路径

 

var binaryTreePaths = function(root) {
    if(root===null) return [];
    if(root.left===null&&root.right===null) return [root.val.toString()];
    let left_paths=binaryTreePaths(root.left);
    let right_paths=binaryTreePaths(root.right);
    let paths=[];
    for(let path of left_paths){
        paths.push(root.val.toString()+"->"+path);
    }
    for(let path of right_paths){
        paths.push(root.val.toString()+"->"+path);
    }
    return paths;
}
// 代码随想录
// 递归法
var binaryTreePaths = function(root) {
    //递归遍历+递归三部曲
    let res = [];
    //1. 确定递归函数 函数参数
    const getPath = function(node,curPath) {
     //2. 确定终止条件,到叶子节点就终止
        if(node.left === null && node.right === null) {
            curPath += node.val;
            res.push(curPath);
            return;
        }
        //3. 确定单层递归逻辑
        curPath += node.val + '->';
        node.left && getPath(node.left, curPath);
        node.right && getPath(node.right, curPath);
    }
    getPath(root, '');
    return res;
 };
//  迭代法:
var binaryTreePaths = function(root) {
    if (!root) return [];
    const stack = [root], paths = [''], res = [];
    while (stack.length) {
      const node = stack.pop();
      let path = paths.pop();
      if (!node.left && !node.right) { // 到叶子节点终止, 添加路径到结果中
        res.push(path + node.val);
        continue;
      }
      path += node.val + '->';
      if (node.right) { // 右节点存在
        stack.push(node.right);
        paths.push(path);
      }
      if (node.left) { // 左节点存在
        stack.push(node.left);
        paths.push(path);
      }
    }
    return res;
  };  
  • #404.左叶子之和

    力扣题目链接

 计算给定二叉树的所有左叶子之和。

404.左叶子之和1

 

var sumOfLeftLeaves=function(root){
    if(root===null) return 0;
    let sum=0;
    if(root.left!==null&&root.left.left===null&&root.left.right===null){
        sum+=root.left.val;
    }
    sum+=sumOfLeftLeaves(root.left);
    sum+=sumOfLeftLeaves(root.right);
    return sum;
}
// 代码随想录
// 递归法
var sumOfLeftLeaves = function(root) {
    //采用后序遍历 递归遍历
    // 1. 确定递归函数参数
    const nodesSum = function(node) {
        // 2. 确定终止条件
        if(node === null) {
            return 0;
        }
        let leftValue = nodesSum(node.left);
        let rightValue = nodesSum(node.right);
        // 3. 单层递归逻辑
        let midValue = 0;
        if(node.left && node.left.left === null && node.left.right === null) {
            midValue = node.left.val;
        }
        let sum = midValue + leftValue + rightValue;
        return sum;
    }
    return nodesSum(root);
};
// 迭代法
var sumOfLeftLeaves = function(root) {
    //采用层序遍历
    if(root === null) {
        return null;
    }
    let queue = [];
    let sum = 0;
    queue.push(root);
    while(queue.length) {
      let node = queue.shift();
      if(node.left !== null && node.left.left === null && node.left.right === null) {
          sum+=node.left.val;
      }
      node.left && queue.push(node.left);
      node.right && queue.push(node.right);
    }
    return sum;
 };

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

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

相关文章

GIS矢量图形多边形地块行政区发光,阴影发光特效实现

先来看下效果: 其实做到发光效果我们必须明白两件事: 1.必须有亮色作为发光色 2.必须有暗色作为衬托色 二者缺一不可 如果你仅仅用了亮色,那么效果是这样的: 注意哦,我使用的是同一个颜色哦,为什么这一次看起来就不是发光呢? 原因很简单,第二幅图我没有加衬托色 ,…

Java基础常见面试题(一)

基础概念与常识 Java 语言有哪些特点? 简单易学;面向对象(封装,继承,多态);平台无关性,平台无关性的具体表现在于,Java 是“一次编写,到处运行(Write Once&…

手把手教你将Eureka升级Nacos注册中心

由于原有SpringCloud体系版本比较老,最初的注册中心使用的Eureka后期官方无升级方案,配置中心无法在线管理配置,还有实时上下线的问题,因此需要将原有系统的Eureka服务升级Nacos注册心服务。原有版本SpringBoot1.5.15、SpringClou…

Python序列类型之集合

💐💐💐欢迎来到小十一的博客!!! 🎯博客主页:🎯程序员小十一的博客 🚀博客专栏:🚀Python入门基础语法 🌷欢迎关注&#xff…

github报错Key is invalid. You must supply a key in OpenSSH public key format

原因:由于github官方提示 普通类型的ssh不安全,所以改成OpenSSH 解决办法 第一步:打开终端。粘贴下面的文本,替换为您的 GitHub 电子邮件地址。连续按回车键 ssh-keygen -t ed25519 -C "your_emailexample.com"第二步…

JavaWeb入门看这一篇文章就够了

第一章 JavaWeb简介 第1节 什么是web 1web(World Wide Web)即全球广域网,也称为万维网,它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者…

插入排序基本概念

插入排序基本概念1.插入排序1.1 基本概念1.2 插入排序执行步骤有1.3 对于5个元素的值步骤次数1.4 插入排序大O记法表示2. 将[4,2,7,1,3]进行插入排序 【实战】2.1 第一次轮回步骤2.2 第二次轮回步骤2.3 第三次轮回步骤2.4 第四次轮回步骤3.插入排序代码实现1.插入排序 1.1 基本…

VHDL语言基础-组合逻辑电路-译码器

目录 译码器的设计: 译码器的分类: 常用译码器: 3-8译码器: 3-8译码器的描述: 小结: 译码器的设计: 译码器和编码器是数字系统中广泛使用的多输入多输出组合逻辑部件。 实现译码的组合逻…

锁与原子操作

锁与原子操作 锁 以自增操作为例子&#xff1a; void *func(void *arg) {int *pcount (int *)arg;int i 0;//while (i < 100000) {(*pcount) ; // 并不会到达100000usleep(1);} }int main(){int i 0;for (i 0;i < THREAD_COUNT;i ) {pthread_create(&thid…

2023年,云计算还有发展前景吗?

云计算在促进经济回暖中扮演者不可或缺的角色&#xff0c;疫情期间复工复产都是基于云计算的基础设施&#xff0c;实现远程办公、在线学习、在线看病、在线政务等等。同时由于数字技术在各个领域的渗透和发展&#xff0c;社会整体对于云技术人才、云服务、算力服务等的需求都在…

虹科分享 | 作为域名系统的SPoF

“SPoF”或“单点故障”背后的思想是&#xff0c;如果系统的一部分发生故障&#xff0c;那么整个系统也会发生故障。 这是不可取的。在IT和安全领域&#xff0c;如果一个组件或子组件的故障会导致系统或应用程序严重中断或降级&#xff0c;那么我们通常认为设计有缺陷。 这就…

OpenAI GPT3 + Flask 利用 text-davinci-003 API 制作自己的交互网页教程 | 附源码 和 Github链接

1. OpenAI GPT3 text-davinci-003 API 最近ChatGPT很火&#xff0c;使用与InstructGPT相同的方法&#xff0c;使用来自人类反馈的强化学习 Reinforcement Learning from Human Feedback (RLHF) 来训练该模型&#xff0c;但数据收集设置略有不同。ChatGPT是在 GPT-3.5 系列中的…

JavaWEB-Servlet

目录 Servlet简介Servlet快速入门Servlet配置详解ServletContext 1 Servlet简介 Servlet 运行在服务端的Java小程序&#xff0c;是sun公司提供一套规范&#xff08;接口&#xff09;&#xff0c;用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码&a…

101-并发编程详解(上篇)

并发编程详解在学习之前&#xff0c;如果多线程的理解足够&#xff0c;可以往下学习&#xff0c;否则的话&#xff0c;建议先看看26章博客&#xff08;只是建议&#xff09;&#xff0c;注意&#xff1a;可能有些字的字体不对&#xff0c;那么一般是复制粘贴来的&#xff0c;但…

前端构建工具 Vite

文章目录参考环境构建工具构建工具的主要功能目前主流的前端构建工具Vite为什么使用 Vite冷启动WebpackVite热更新优化热更新优化预构建依赖Webpack VS ViteVite 的缺点首屏性能懒加载与 Vite 相关的基本操作获取create-vite创建项目Project nameSelect a frameworkSelect a va…

信息系统与信息化

1.1 信息系统与信息化 1.1.1 信息的基本概念 信息质量属性(掌握)信息传输模型 1.1.2 信息系统的基本概念1.1.3 信息化的基本概念 信息化的五个层次信息化基本内涵信息化的基本概念&#xff08;了解&#xff09;六要素关系图&#xff08;掌握&#xff09; 1.1.4 信息系统生命周…

Qml学习——动态加载控件

最近在学习Qml&#xff0c;但对Qml的各种用法都不太熟悉&#xff0c;总是会搞忘&#xff0c;所以写几篇文章对学习过程中的遇到的东西做一个记录。 学习参考视频&#xff1a;https://www.bilibili.com/video/BV1Ay4y1W7xd?p1&vd_source0b527ff208c63f0b1150450fd7023fd8 目…

91.【SpringBoot-03】

SpringBoot-03(十四)、任务1.异步任务2.邮件任务(1).简单邮箱发送(2).复杂邮箱发送3.定时任务(1).cron表达式(2).特殊表达式(3).定时任务测试(4).常用cron表达式(十五)、Dubbo和Zookeeper集成1.分布式原理(1).Dubbo文档2.什么是RPC?3.Dubbo的概念和介绍(1).Dubbo是什么(2). Du…

详细聊聊spring核心思想

犹记我当年初学 Spring 时&#xff0c;还需写一个个 XML 文件&#xff0c;当时心里不知所以然&#xff0c;跟着网上的步骤一个一个配置下来&#xff0c;配错一个看着 error 懵半天&#xff0c;不知所谓地瞎改到最后能跑就行&#xff0c;暗自感叹 tmd 这玩意真复杂。 到后来用上…

最短路之Dijkstra(15张图解)

&#x1f33c;多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 闲来无事听听歌 Dijkstra可解决“单源最短路径”问题 四种最短路算法 Floyd算法 时间复杂度高&#xff0c;但实现容易&#xff08;5行核心代码&#xff09;&#xff0c;可解决负权边&#xff0c;适用于数据范围…