算法打卡 Day19(二叉树)-平衡二叉树 + 二叉树的所有路径 + 左叶子之和 + 完全二叉树的节点个数

news/2024/9/17 19:06:50/ 标签: 算法, c++, 数据结构, leetcode

Leetcode 101-平衡二叉树

文章目录

  • Leetcode 101-平衡二叉树
    • 题目描述
    • 解题思路
  • Leetcode 257-二叉树的所有路径
    • 题目描述
    • 解题思路
  • Leetcode 404-左叶子之和
    • 题目描述
    • 解题思路
  • Leetcode 222-完全二叉树的节点个数
    • 题目描述
    • 解题思路

题目描述

https://leetcode.cn/problems/balanced-binary-tree/description/

在这里插入图片描述

解题思路

二叉树节点的深度是指从根节点到该节点的最长简单路径边的条数。

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

这道题我们使用递归,采用后序遍历的方法,不断获得左右节点的高度,并在中间节点比较其高度是否符合平衡二叉树的要求

class Solution {
public:int getHight(TreeNode* root) {if (root == nullptr) return 0;int leftHeight = getHight(root->left);if (leftHeight == -1) return -1;int rightHeight = getHight(root->right);if (rightHeight == -1) return -1;int result;if (abs(leftHeight - rightHeight) > 1) result = -1;else result = 1 + max(leftHeight , rightHeight); return result;}bool isBalanced(TreeNode* root) {return getHight(root) == -1 ? false : true;}
};

Leetcode 257-二叉树的所有路径

题目描述

https://leetcode.cn/problems/binary-tree-paths/description/

在这里插入图片描述

解题思路

采用前序算法依次遍历

class Solution {
public:void tranversal(TreeNode* cur, vector<int>& path, vector<string>& result) {path.push_back(cur->val);//中if (cur->left == nullptr && cur->right == nullptr) {string sPath;for (int i = 0; i < path.size()-1; i++) {sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]);result.push_back(sPath);return;}if (cur->left) {tranversal(cur->left, path, result);path.pop_back();//回溯}if (cur->right) {tranversal(cur->right, path, result);path.pop_back();//回溯}}vector<string> binaryTreePaths(TreeNode* root) {vector<string>result;vector<int>path;if (root == nullptr)return result;tranversal(root, path, result);return result;}
};

Leetcode 404-左叶子之和

题目描述

在这里插入图片描述

解题思路

叶子节点的左右子节点都为 nullptr,左叶子节点指的是该叶子节点是父节点的左节点。

采用递归后序遍历的方式解决:

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {if (root == nullptr) return 0;if (root->left == nullptr && root->right == nullptr) return 0;int leftValue = sumOfLeftLeaves(root->left);//左if (root->left && root->left->left == nullptr && root->left->right == nullptr) leftValue = root->left->val;int rightValue = sumOfLeftLeaves(root->right);//右int sum = leftValue + rightValue;//中return sum;}
};

Leetcode 222-完全二叉树的节点个数

题目描述

在这里插入图片描述

解题思路

完全二叉树的定义是:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1-2^h 个节点。

不考虑完全二叉树的特性,仅将其当作普通二叉树,采用后序遍历的代码为:

class Solution {
public:int countNodes(TreeNode* root) {if (root == nullptr) return 0;int leftNode = countNodes(root->left);int rightNode = countNodes(root->right);int sum = leftNode + rightNode + 1;return sum;}
};

此时我们将所有节点都遍历了一遍,因此时间复杂度为 O ( n ) O(n) O(n)

为了降低时间复杂度,我们可以利用完全二叉树的特性,即对于满二叉树,其节点个数为(2^n-1),在遍历过程中仅仅遍历两侧的节点,从而可以降低时间复杂度

class Solution {
public:int countNodes(TreeNode* root) {if (root == nullptr) return 0;TreeNode* left = root->left;TreeNode* right = root->right;int leftDepth = 1, rightDepth = 1;while (left) {//遍历左侧深度left = left->left;leftDepth++;}while (right) {//遍历右侧深度right = right->right;rightDepth++;}if (leftDepth == rightDepth)return (pow(2, leftDepth) - 1);//如果为满二叉树则根据公式直接计算节点个数int leftNum = countNodes(root->left);int rightNum = countNodes(root->right);int sum = leftNum + rightNum + 1;return sum;}
};

http://www.ppmy.cn/news/1507077.html

相关文章

ESP8266-12E/F 内存分配

参考&#xff0c;,参考1&#xff0c;参考2&#xff0c;参考3 两款模组的不同 可以看出在使用功能和内存功能都一样。参考4 硬件介绍 模组中主要部分的芯片是乐鑫的esp8266&#xff0c;flash使用w25q32&#xff08;4MB&#xff09;参考&#xff0c;参考3 内存介绍 乐鑫…

黑马Java零基础视频教程精华部分_14_正则表达式

系列文章目录 文章目录 系列文章目录一、先爽一下正则表达式不使用正则的情况下使用正则的情况下 二、正则表达式的作用三、正则表达式具体表达1、规则2、字符类示例3、预定义字符示例首先学习转义字符 示例练习 四、基本练习1、快捷方法&#xff1a;2、验证手机号3、验证座机电…

02.CH59x入门指南——点亮LED

CH59x入门指南——点亮LED 文章目录 CH59x入门指南——点亮LED一、简介二、准备工作2.1 硬件条件2.2 项目条件 三、项目实现3.1 硬件部分3.2 软件部分3.3 运行结果 四、写在最后 ​ 一、简介 从本文开始&#xff0c;即将一一介绍 CH59x 的相关外设以及使用方法。 从任何一块芯…

Linux Shell编程--变量

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 变量&#xff1a; bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能 预定义变量、环境变量、自定义变量、位置变量 一、自定义变…

self的使用

目录 一、看一段代码&#xff0c;并分析问题 二、二说self 1、成员方法定义的基本语法 2、使用细节 一、看一段代码&#xff0c;并分析问题 class Dog:name"波斯猫"age2def info(self,name):print(f"name信息&#xff1a;{name}") # 加菲猫dogDog() …

Dirsearch 工具的安装、使用详细教程

Dirsearch 工具的安装、使用详细教程 Dirsearch简介 安装步骤 语法及参数 常见Payload 渗透实例 总结 Dirsearch简介 Dirsearch 是一个用于探测Web服务器上的隐藏目录和文件的工具。它通过发送HTTP请求来尝试访问可能存在的路径&#xff0c;从而找到不列在网站目录页面上的…

河工院首届工业设计大赛程序组(挑战赛)题解

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 寻找ACMer 思想&#xff1a; 签到题按照题意遍历字符串&#xff0c;不断向后寻找包含 ACMer 完整字符串的数量即可 std标程&#xff1a; #include <iostream> #include <cstring> #include …

人工智能时代,程序员如何保持核心竞争力?

人工智能时代&#xff0c;程序员如何保持核心竞争力&#xff1f; 在人工智能的浪潮中&#xff0c;程序员的角色和工作方式正在经历前所未有的变革。AIGC技术的兴起&#xff0c;如ChatGPT、Midjourney、Claude等&#xff0c;预示着AI辅助编程工具的日益普及。面对这一趋势&…

海量日志数据收集监控平台应该怎么设计和实现

设计和实现一个海量日志数据收集和监控平台&#xff0c;需要考虑以下几个关键方面&#xff1a;数据采集、数据存储、实时处理、监控与告警、可视化分析、扩展性和高可用性。以下是一个详细的设计和实现方案&#xff1a; 1. 需求分析 日志来源&#xff1a;明确日志的来源&…

图谱驱动的智能:如何用Django实现GraphRAG的高效检索

前言 前面一章讲述了构建知识图谱来提高基于 RAG 的应用程序的准确性,并且使用 Neo4j 和 LangChain 在 RAG 应用程序中构建和检索知识图谱信息。 图形检索增强生成 (Graph RAG) 这种方法利用图形数据库的结构化特性,将数据组织为节点和关系,以增强检索信息的深度和上下文性…

HDFS写入数据的流程图

1.客户端向namenode发送请求&#xff0c;请示写入数据 2.namenode接受请求后&#xff0c;判断这个用户是否有写入权限&#xff0c;如果不具备直接报错&#xff1b;如果有写入权限&#xff0c;接着判断在要写入的目录下是否已经存在这个文件&#xff0c;如果存在&#xff0c;直…

Ubuntu gnome WhiteSur-gtk-theme类mac主题正确安装和卸载方式

目录 摘要目的安装和卸载特别说明 Ubuntu gnome WhiteSur-gtk-theme类mac主题正确安装和卸载方式 摘要 Ubuntu版本&#xff1a;ubuntu24.04 主题下载地址&#xff1a;https://github.com/vinceliuice/WhiteSur-gtk-theme 参考的安装教程&#xff1a;https://blog.51cto.com/u_…

Mybatis的详细讲解

1.前情提要 1.1三层架构 &#xff08;1&#xff09;表现层 Controller 表现层是表示的事数据的接受&#xff0c;参数的校验&#xff0c;参数的转换&#xff0c;结果的转换&#xff0c;结果的返回 &#xff08;2&#xff09;业务逻辑层 Service 介于表现层和业务逻辑层之…

使用Cisco软件进行模拟万维网配置访问服务器过程

万维网(www)实验 文章目录 万维网(www)实验1.实验目的2.实验流程3.实验步骤 1.实验目的 1&#xff09;理解www站点 2&#xff09;理解上层应用和下层通信网络的关系 2.实验流程 开始 → 布置拓扑 → 配置路由及IP地址 → 配置web服务器→ 访问服务器 →结束 3.实验步骤 1&…

Vercel Error: (Azure) OpenAI API key not found

题意&#xff1a;Vercel 错误&#xff1a;(Azure) OpenAI API 密钥未找到 问题背景&#xff1a; I implemented openAI API in my Next.js app with the help of langchain library and it works superb on localhost, but in Vercel (ProVersion) it throws an error: 我使用…

js函数的arguments 对象

arguments对象是函数中传递的参数值的集合。 它是⼀个类似数组的对象&#xff0c;因为它有⼀个length属性&#xff0c; 我们可以使⽤数组索引表示法arguments[1]来访问单个值&#xff0c;但它没有数组中的内置⽅法&#xff0c; 如&#xff1a;forEach、reduce、filter和map。 …

AI的IDE:Cursor配置虚拟python环境(conda)

AI的IDE&#xff1a;Cursor配置虚拟python环境&#xff08;conda&#xff09; Cursor是一个AI的IDE&#xff0c;是从VSCode源代码中fork出来的&#xff0c;专注于和AI一起Coding而生。https://www.cursor.com/是官方地址。最近开始逐渐的试用Cursor&#xff0c;之前一直是VSCod…

机器学习之随机森林

文章目录 1. 随机森林概述1.1 定义与起源1.2 与其他算法的比较 2. 随机森林的工作原理2.1 决策树基础2.2 Bagging机制2.3 随机性的引入 3. 随机森林的构建过程3.1 数据准备3.2 特征选择3.3 多棵树的集成 4. 随机森林的优缺点分析4.1 优势4.2 局限性 5. 随机森林的应用场景5.1 分…

Kali Linux——网络安全的瑞士军刀

一、引言 在网络安全的领域中&#xff0c;Kali Linux 宛如一把强大而全能的瑞士军刀&#xff0c;为安全研究人员和专业人士提供了丰富的工具和资源。本文将深入探讨 Kali Linux 的特点、优势、常用工具以及实际应用场景&#xff0c;带您领略这一强大操作系统的魅力。 二、Kal…

OpenCV||超详细的图像金字塔

图像金字塔是一种图像的多尺度表示方法&#xff0c;它通过对原始图像进行一系列的处理&#xff0c;生成一系列分辨率逐渐降低的图像集合。这些图像按照分辨率从高到低&#xff08;或从低到高&#xff09;的顺序排列&#xff0c;形成类似金字塔的结构&#xff0c;因此得名图像金…