算法学习——LeetCode力扣二叉树篇4

算法学习——LeetCode力扣二叉树篇4

在这里插入图片描述

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

222. 完全二叉树的节点个数 - 力扣(LeetCode)

描述

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

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

示例

示例 1:

输入:root = [1,2,3,4,5,6]
输出:6

示例 2:

输入:root = []
输出:0

示例 3:

输入:root = [1]
输出:1

提示

  • 树中节点的数目范围是[0, 5 * 104]
  • 0 <= Node.val <= 5 * 104
  • 题目数据保证输入的树是 完全二叉树

进阶

遍历树来统计节点是一种时间复杂度为 O(n) 的简单解决方案。你可以设计一个更快的算法吗?

代码解析

递归法–普通二叉树
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int getNoteNum(TreeNode* cur){if(cur==nullptr) return 0;int left_num = getNoteNum(cur->left);int right_num = getNoteNum(cur->right);return 1 + left_num + right_num;}int countNodes(TreeNode* root) {if(root==nullptr) return 0;return getNoteNum(root);}
};
递归法–完全二叉树

完全二叉树节点数公式:2^树的高度(深度+1)-1

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int getnodenum(TreeNode* cur){if(cur==nullptr) return 0 ;TreeNode* left_tree = cur->left , *right_tree = cur->right;int left_tree_num=0 , right_tree_num=0;//分别结算左右树的深度是否一样,一样则是完全二叉树while(left_tree!=nullptr){left_tree = left_tree->left;left_tree_num++;}while(right_tree!=nullptr){right_tree = right_tree->right;right_tree_num++;}if(left_tree_num == right_tree_num ){//完全二叉树节点数量的公式是2^(树的高度)-1// return (2<<left_tree_num) - 1;// left_tree_num是树的深度,要+1return  pow(2,left_tree_num+1) - 1; }else{return 1 + getnodenum(cur->left) + getnodenum(cur->right) ;}}int countNodes(TreeNode* root) {if(root ==nullptr) return 0;return getnodenum(root);}
};

110. 平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)

描述

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

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

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

示例

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示

  • 树中的节点数在范围 [0, 5000] 内
  • -104 <= Node.val <= 104

代码解析

求二叉树的深度和高度
深度:前序遍历

  • 深度从根节点往下找,在递归栈增加的时候计算
    高度:后序遍历
  • 高度从叶子节点网上找,在递归栈减少的时候计算
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public://计算树的高度,后序遍历。当不是平衡二叉树(左右子树高度最多差1)的时候返回-1int get_tree_height(TreeNode* cur){if(cur==nullptr) return 0;int left_height = get_tree_height(cur->left);if(left_height == -1) return -1;//如果左子树不是平衡二叉树,整个树也不是平衡二叉树int right_height =get_tree_height(cur->right);if(right_height == -1) return -1;//如果右子树不是平衡二叉树,整个树也不是平衡二叉树//两个子树是平衡二叉树,但是不确定整个树是不是平衡二叉树,计算两个树的高度差//如果高度差大于1,则不是平衡二叉树。如果高度差是0或者1,则平衡二叉树的高度是最高子树加上根节点1return  abs(left_height - right_height) > 1 ? -1 : 1+max(left_height , right_height);}bool isBalanced(TreeNode* root) {if(root == nullptr) return true;return  get_tree_height(root)== -1 ? false:true;}
};

257. 二叉树的所有路径

257. 二叉树的所有路径 - 力扣(LeetCode)

描述

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

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

示例

示例 1:

输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]

示例 2:

输入:root = [1]
输出:[“1”]

提示

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

代码解析

递归法(非回溯,浪费内存)

直接递归字符串,每一次递归都产生一个新字符串。没有回溯的过程,浪费空间。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<string> result;void get_road(TreeNode* cur  , string &s){if(cur == nullptr) return;s += to_string(cur->val);if(cur->left == nullptr && cur->right == nullptr ){result.push_back(s);return;}else if(cur->left != nullptr && cur->right == nullptr ){   s += "->";string s1 =s;get_road(cur->left ,s1);}else if (cur->left == nullptr && cur->right != nullptr ){s += "->";string s1 =s;get_road(cur->right ,s1);}else{s += "->";string s1 =s;string s2 =s;get_road(cur->left ,s1);get_road(cur->right ,s2);}return;}vector<string> binaryTreePaths(TreeNode* root) {string s;get_road(root ,s);return result;}
};
递归回溯法

使用一个数组来保存路径数据,然后在转换成字符串。
效率略低,充分体现回溯的思想。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void get_road(TreeNode* cur  , vector<string> &result , vector<int> &path){if(cur == nullptr) return;path.push_back(cur->val);if(cur->left == nullptr && cur->right == nullptr ){string tmp;for(int i=0 ; i < path.size()-1 ;i++ ){tmp += to_string(path[i]);tmp += "->";}tmp += to_string(path[path.size()-1]);result.push_back(tmp);return;}if(cur->left != nullptr  ){   get_road(cur->left,result,path);path.pop_back();} if(cur->right != nullptr){get_road(cur->right,result,path);path.pop_back();}return;}vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;if(root == nullptr) return result;get_road(root ,result , path);return result;}
};
递归回溯(精简版)

不使用数组进行纪录,直接进行字符串回溯

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void get_road(TreeNode* cur  , vector<string> &result , string path){if(cur == nullptr) return;path +=  to_string(cur->val);if(cur->left == nullptr && cur->right == nullptr ){result.push_back(path);return;}if(cur->left != nullptr  ){   get_road(cur->left,result, path + "->");} if(cur->right != nullptr){get_road(cur->right,result, path + "->");path.pop_back();}return;}vector<string> binaryTreePaths(TreeNode* root) {vector<string> result;string path;if(root == nullptr) return result;get_road(root ,result , path);return result;}
};

404. 左叶子之和

404. 左叶子之和 - 力扣(LeetCode)

描述

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

示例

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2:

输入: root = [1]
输出: 0

提示

  • 节点数在 [1, 1000] 范围内
  • -1000 <= Node.val <= 1000

代码解析

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int result=0;void left_sum(TreeNode* cur){if(cur==nullptr) return ;//判断左子叶if(cur->left!=nullptr&&cur->left->left==nullptr&&cur->left->right==nullptr) result += cur->left->val;left_sum(cur->left);left_sum(cur->right);}int sumOfLeftLeaves(TreeNode* root) {left_sum(root);return result;}
};

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

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

相关文章

python疾病心理学发展重要性

心理学是研究人类思维、情感、行为及其发展的科学&#xff0c;而疾病心理学则专注于研究与疾病和健康相关的心理过程和行为。以下是疾病心理学发展的重要性&#xff1a; 促进健康与预防疾病&#xff1a;疾病心理学研究可以帮助我们了解心理因素如何影响健康和疾病的发展。通过了…

车载诊断协议DoIP系列 —— 协议中术语解释和定义

车载诊断协议DoIP系列 —— 协议中术语解释和定义 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,…

蓝桥杯每日一题------背包问题(四)

前言 前面讲的都是背包的基础问题&#xff0c;这一节我们进行背包问题的实战&#xff0c;题目来源于一位朋友的询问&#xff0c;其实在这之前很少有题目是我自己独立做的&#xff0c;我一般习惯于先看题解&#xff0c;验证了题解提供的代码是正确的后&#xff0c;再去研究题解…

罗德里格斯公式简要介绍

一、罗德里格斯公式&#xff08;Rodrigues’ rotation formula&#xff09;是一个用于计算绕任意轴旋转向量的数学公式。它是由欧仁罗德里格斯&#xff08;Olinde Rodrigues&#xff09;在1840年提出的。这个公式在三维空间中描述了一个向量绕着单位向量旋转θ角度后的结果。 …

C++初阶:容器(Containers)list常用接口详解

介绍完了vector类的相关内容后&#xff0c;接下来进入新的篇章&#xff0c;容器list介绍&#xff1a; 文章目录 1.list的初步介绍2.list的定义&#xff08;constructor&#xff09;3.list迭代器&#xff08; iterator &#xff09;4.string的三种遍历4.1迭代器4.2范围for循环 5…

BatchNorm介绍:卷积神经网络中的BN

一、BN介绍 1.原理 在机器学习中让输入的数据之间相关性越少越好&#xff0c;最好输入的每个样本都是均值为0方差为1。在输入神经网络之前可以对数据进行处理让数据消除共线性&#xff0c;但是这样的话输入层的激活层看到的是一个分布良好的数据&#xff0c;但是较深的激活层…

MyBatis执行流程

MyBatis是一个流行的Java持久层框架&#xff0c;它封装了JDBC操作&#xff0c;使开发者可以通过XML或注解的方式映射SQL语句&#xff0c;并将POJO与数据库表之间进行映射。了解MyBatis的执行流程&#xff0c;可以帮助开发者更好地理解其内部工作机制&#xff0c;优化代码并解决…

企业微信自动推送机器人的应用与价值

随着科技的快速发展&#xff0c;企业微信自动推送机器人已经成为了企业数字化转型的重要工具。这种机器人可以自动推送消息、执行任务、提供服务&#xff0c;为企业带来了许多便利。本文将探讨企业微信自动推送机器人的应用和价值。 一、企业微信自动推送机器人的应用 企业微信…

无人机飞行控制系统功能,多旋翼飞行控制系统概述

飞行控制系统存在的意义 行控制系统通过高效的控制算法内核&#xff0c;能够精准地感应并计算出飞行器的飞行姿态等数据&#xff0c;再通过主控制单元实现精准定位悬停和自主平稳飞行。 在没有飞行控制系统的情况下&#xff0c;有很多的专业飞手经过长期艰苦的练习&#xff0…

「数据结构」串

串的定义和实现 串的定义 串: 即字符串&#xff0c;零个或多个字符组成的有限序列串的长度&#xff1a;串中字符的个数n空串&#xff1a;n0时的串子串&#xff1a;串中任意多个连续的字符组成的子序列主串&#xff1a;包含子串的串字符在主串中的位置&#xff1a;字符在串中的…

【Docker进阶】镜像制作-用Dockerfile制作镜像(一)

进阶一 docker镜像制作 文章目录 进阶一 docker镜像制作用dockerfile制作镜像dockerfile是什么dockerfile格式为什么需要dockerfileDockerfile指令集合FROMMAINTAINERLABELCOPYENVWORKDIR 用dockerfile制作镜像 用快照制作镜像的缺陷&#xff1a; 黑盒不可重复臃肿 docker…

嵌入式大厂面试题(1)—— CVTE

从本篇开始将会更新历年来各个公司的面试题与面经&#xff0c;题目来自于网上各个平台以及博主自己遇到的&#xff0c;如果大家有所帮助&#xff0c;帮忙点点赞和关注吧&#xff01; 岗位&#xff1a;嵌入式软件工程师。 面试时间&#xff1a;20分钟。 面试 1 、简历中写了做过…

Kafka 入门笔记

课程地址 概述 定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff09; 发布/订阅&#xff1a;消息的发布者不会将消息直接发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只接受感兴趣的消息 消息队列 消息队…

HCIA-Datacom实验指导手册:4.3 实验三:网络地址转换配置实验

HCIA-Datacom实验指导手册&#xff1a;4.3 实验三&#xff1a;网络地址转换配置实验 一、实验介绍&#xff1a;二、 思考题与附加内容 一、实验介绍&#xff1a; NAT的作用&#xff1a; 1、很大程度提高网络安全性。 2、控制内外网网络联通性问题。 特点&#xff1a; 1&#…

JDK 11 vs JDK 8:探索Java的新特性和改进

随着技术的不断进步&#xff0c;Java开发工具包&#xff08;JDK&#xff09;也在不断演变&#xff0c;为开发者带来更高效、更安全的编程体验。在这篇文章中&#xff0c;我们将重点探讨JDK11相较于JDK 8所引入的一些新特性和改进&#xff0c;以便您能够更好地了解Java的最新发展…

leetcode:买卖股票最佳时机二

思路&#xff1a; 使用贪心算法&#xff1a;局部最优是将买卖过程中产生的正数进行相加&#xff0c;进而使得最后结果最大&#xff08;全局最优&#xff09;。 price [7,1,5,10,3,6,4] -6,4,5,-7,3,-2 正数相加就得到了最大 代码实现&#xff1a; 1.循环中下标从1开始 …

大数据的基础探索之大数据时代

前言&#xff1a;大数据已经是大势所趋&#xff0c;在这个网络时代能够不断地整合资源的人本身也是一种能力拥有者&#xff0c;在这个时代&#xff0c;如果一个人可以掌握数据分析工具&#xff0c;利用好云计算的能力&#xff0c;对于自己的个人而言来说都是一个极其重要的参与…

【PyTorch】张量(Tensor)的生成

PyTorch深度学习总结 第一章 Pytorch中张量(Tensor)的生成 文章目录 PyTorch深度学习总结一、什么是PyTorch&#xff1f;二、张量(Tensor)1、张量的数据类型2、张量生成和信息获取 总结 一、什么是PyTorch&#xff1f; PyTorch是一个开源的深度学习框架&#xff0c;基于Python…

20240212请问如何将B站下载的软字幕转换成为SRT格式?

20240212请问如何将B站下载的软字幕转换成为SRT格式&#xff1f; 2024/2/12 12:47 百度搜索&#xff1a;字幕 json 转 srt json srt https://blog.csdn.net/a_wh_white/article/details/120687363?share_token2640663e-f468-4737-9b55-73c808f5dcf0 https://blog.csdn.net/a_w…

上位机图像处理和嵌入式模块部署(利用python开发软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 开发windows和linux软件的时候&#xff0c;大家一般都是习惯于用c/c语言进行开发&#xff0c;但是目前来说很多的开发板都是支持python语言开发的。…