代码随想录算法训练营第17天|二叉树

平衡二叉树

这种开销太大了,最好是能够在获得子树高的递归中同时判断子树是否平衡,但是我纠结的是递归的输出是布尔类型,而不是数字类型,怎么在迭代子树是否平衡时计算子树的高度呢(迭代可以计算,但是我想不通的是怎么返回)

/*** 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}*/// 1.输入参数:结点
//   输出:以该结点为根节点的子树是否是平衡的
// 2.递归边界,结点为空
// 3.单层逻辑分析:
// 了解平衡二叉树:平衡二叉树的左右子树的高的差值不会超过1
// 所以在只要求左子树和右子树的高度并进行判断var isBalanced = function(root) {if(!root) return true;//判断左右子树是否是平衡二叉树let flag = isBalanced(root.left) && isBalanced(root.right);if(!flag) return false;//左右子树是平衡二叉树,判断以root为根的二叉树是否平衡 let ldepth = gethigh(root.left);let rdepth = gethigh(root.right);console.log(ldepth,rdepth);if(Math.abs(ldepth - rdepth) > 1) return false;return true;
};function gethigh(root){if(!root) return 0;return 1 + Math.max(gethigh(root.left), gethigh(root.right));
}

参考了代码随想录,解决办法就是改变函数的输出,把迭代函数主体看作是计算子树高度的迭代,并在计算时顺便判断子树是否平衡,如果不平衡的话直接输出-1,平衡就正常输出子树的高数

/*** 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 isBalanced = function(root) {return getHeight(root) === -1 ? false :true;};function getHeight(node){if(!node) return 0;let leftHeight = getHeight(node.left);if(leftHeight === -1) return -1;let rightHeight = getHeight(node.right);if(rightHeight === -1) return -1;if(Math.abs(leftHeight - rightHeight) > 1) return -1;return 1 + Math.max(leftHeight, rightHeight);
}

树的路径

/*** 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 {string[]}*/
var binaryTreePaths = function(root) {let res = [];dfs(root, res, "")return res;
};function dfs(node, res, str){str += node.val;if(!node.right && !node.left){//在这里判断是否是叶子结点,可以提前在为null前回溯res.push(str);return;}if(node.left) dfs(node.left, res, str + "->");if(node.right) dfs(node.right, res, str + "->");
}

404. 左叶子之和

/*** 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 sumOfLeftLeaves = function(root) {let res = [];if(root.left || root.right) dfs(root, res);let sum = 0;console.log('sum:',res);for(item of res){sum += item;}return sum;
};function dfs(node, res){// 叶子结点if(!node.left && !node.right){console.log(node.val);res.push(node.val)return;}// 非叶子结点let leftChild = node.left;let rightChild = node.right;// 如果有左孩子,都走if(leftChild) dfs(leftChild, res);// 如果有右孩子,判断右孩子是不是叶子结点if(rightChild){if(!rightChild.left && !rightChild.right){return;}else{// 不是叶子结点,走dfs(rightChild, res);}}
}// 该结点是叶子结点,必须是右叶子
// 该结点不是叶子结点,那向哪个方向遍历
// 如果左孩子是叶子结点,走
//如果左孩子不是叶子结点,走
//如果右孩子是叶子结点,不走
//如果右孩子不是叶子结点,走
//综上,只需要判断右孩子是不是叶子结点

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

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

相关文章

php高级之框架源码、宏扩展原理与开发

在使用框架的时候我们经常会看到如下代码 类的方法不会显示地声明在代码里面,而是通过扩展的形式后续加进去,这么做的好处是可以降低代码的耦合度、保证源码的完整性、团队开发的时候可以分别写自己的服务去扩展类,减少代码冲突等等。我自己…

C语言之常用字符串函数总结、使用和模拟实现

文章目录 目录 一、strlen 的使用和模拟实现 二、strcpy 的使用及模拟实现 三、strcat 的使用和模拟实现 四、strcmp 的使用和模拟实现 五、strncpy 的使用和模拟实现 六、strncat 的使用和模拟实现 七、strncmp 的使用和模拟实现 八、strstr 的使用和模拟实现 九、st…

使用Python批量处理Excel的内容

正文共:1500 字 10 图,预估阅读时间:1 分钟 在前面的文章中(如何使用Python提取Excel中固定单元格的内容),我们介绍了如何安装Python环境和PyCharm工具,还利用搭好的环境简单测试了一下ChatGPT提…

java程序提供默认实现策略,并支持自定义实现策略的一种方式?并如何避雷?

java程序提供默认实现策略,并支持自定义实现策略的一种方式?并如何避雷? 方案? 说明: 当前是基于自定义策略注册由工具类提供,且默认实现策略全局可访问的前提下进行探讨,其他场景也可进行参…

Java 数据类型 -- Java 语言的 8 种基本数据类型、字符串与数组

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 004 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

如何秒杀系统架构设计

原文路径:https://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f/00%20%e5%bc%80%e7%af%87%e8%af%8d%20%e7%a7%92%e6%9d%80%e7%b3%bb%e7%bb%9f%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%…

纳什均衡:博弈论中的运作方式、示例以及囚徒困境

文章目录 一、说明二、什么是纳什均衡?2.1 基本概念2.2 关键要点 三、理解纳什均衡四、纳什均衡与主导策略五、纳什均衡的例子六、囚徒困境七、如何原理和应用7.1 博弈论中的纳什均衡是什么?7.2 如何找到纳什均衡?7.3 为什么纳什均衡很重要&a…

素数的无穷大的证明

素数的无穷大——欧几里得的证明 文章目录 一、说明二、欧几里得证据三、哥德巴赫对素数无穷性的证明(1730)四、Frstenberg 对素数无穷性的证明(1955)五、库默尔对欧几里得证明的重述 一、说明 众所周知,素数是无限多的。然而,两…

运维一个宝塔面板的php项目的艰辛历程【解决了http3,ssl,quic】

在这个项目的环境 使用了宝塔面板 有4个php:php5.6,php7.3,php7.4,php8.0 nignx为1.20版本 升级计划: 升级nginx1.26.0版本,添加上http3协议,添加ssl证书 遇到的问题: 升级nginx1.26版本后 无法打开php5.6的后台 原因&#xff…

【知识点】nullptr 和 NULL

在 C 中,nullptr 和 NULL 都可以用来表示空指针,但是它们之间有一些重要的区别。这些区别涉及到类型安全性、代码可读性和在不同版本的 C 中的使用情况。 NULL NULL 是一个宏,通常定义为 0 或 (void*)0,它最初是在 C 语言中引入…

vmware-17虚拟机安装教程,安装linux centos系统

下载VMware 1.进入VMware官网:https://www.vmware.com/sg/products/workstation-pro.html 2.向下翻找到,如下界面并点击“现在安装” 因官网更新页面出现误差,现提供vmware17安装包网盘链接如下: 链接:https://pan.b…

Vue17-条件渲染

一、使用v-show属性做条件渲染 控制元素的显示和隐藏 v-show里面也能是表达式,只要表达式的值是boolean就行。 或者 当时结构还在: 二、使用v-if属性做条件渲染 结构也不在了 三、示例 方式一: 方式二: 当元素有很高的切换频率&am…

从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(四)

上一章节我们了解了 shuffle 相关的概念和原理后其实可以发现一个问题,那就是 shuffle 比较容易造成数据倾斜的情况。 例如上一节我们看到的图,在这批数据中,hello 这个单词的行占据了绝大部分,当我们执行 groupByKey 的时候触发了…

刚刚❗️德勤2025校招暑期实习测评笔试SHL测评题库已发(答案)

📣德勤 2024暑期实习测评已发,正在申请的小伙伴看过来哦👀 ㊙️本次暑期实习优先考虑2025年本科及以上学历的毕业生,此次只有“审计及鉴定”“税务与商务咨询”两个部门开放了岗位~ ⚠️测评注意事项: &#x1f44…

pdf分割为bmp

import fitz # PyMuPDF import os from PIL import Imagedef convert_pdf_to_bmp(pdf_path, output_folder):"""将单个PDF文件的每一页转换为BMP格式的图像。:param pdf_path: PDF文件的路径。:param output_folder: 保存BMP图像的输出文件夹路径。""…

简单了解java中的正则表达式

正则表达式 1、正则表达式认识 正则表达式通常用来校验,检查字符串是否符合规则,由一些特定的字符组成的字符串校验规则,就称之为正则表达式。 2、正则表达式能干啥? 正则表达式只能针对字符串格式进行校验,所以它…

使用Nextjs学习(学习+项目完整版本)

创建项目 运行如下命令 npx create-next-app next-create创建项目中出现的各种提示直接走默认的就行,一直回车就行了 创建完成后进入到项目运行localhost:3000访问页面,如果和我下面页面一样就是创建项目成功了 整理项目 将app/globals.css里面的样式都删除,只留下最上面三…

独孤思维:副业圈很多骗子

01 副业圈鱼龙混杂,别没事和别人撕b。 不认可就退群,取关。 和一个垃圾人互怼,爆粗口,耗费的是自己的体力和时间。 结果也只会一地鸡毛,得不偿失。 专注,只服务于认可你的人,只付费你认可的…

C#面:什么是DLL文件,使用它们有什么好处

在C#中,DLL(Dynamic Link Library)文件是一种可重用的代码库,它包含了已编译的函数、类、数据和资源。DLL文件可以被多个应用程序共享和重用,这样可以提高代码的复用性和可维护性。 使用DLL文件有以下几个好处&#x…

【LeetCode算法】第112题:路径总和

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路:二叉树先序遍历。首先访问根节点,若根节点是叶子节点并且值等于目标值,则返回true,否则递归访问左子树和右子树,只要左…