C++数据结构与算法——二叉树的属性

C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!

文章目录

  • 一、对称二叉树(力扣101)
  • 二、二叉树的最大深度(力扣104)
  • 三、二叉树的最小深度(力扣111)
  • 四、完全二叉树的节点个数(力扣222)
  • 五、平衡二叉树(力扣110)
  • 六、二叉树的所有路径(力扣257)
  • 七、左叶子之和(力扣404)
  • 八、找树左下角的值(513)
  • 九、路径总和(力扣112)

一、对称二叉树(力扣101)

在这里插入图片描述

/*** 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:bool isSymmetric(TreeNode* root) {if(root==NULL) return root;return isSymmetricLeftRight(root->left,root->right);}bool isSymmetricLeftRight(TreeNode* left,TreeNode* right){if(left==NULL&&right==NULL) return true;else if(left==NULL&&right!=NULL) return false;else if(left!=NULL&&right==NULL) return false;else if(left->val!=right->val) return false;else{bool outside = isSymmetricLeftRight(left->left,right->right);bool inside = isSymmetricLeftRight(left->right,right->left);if(outside!=true||inside!=true){return false;}}return true;}
};

在这里插入图片描述

二、二叉树的最大深度(力扣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:int maxDepth(TreeNode* root) {if(root==NULL) return 0;int leftDepth = maxDepth(root->left);int rightDepth = maxDepth(root->right);int result = 1+max(leftDepth,rightDepth);return result;}
};

在这里插入图片描述

三、二叉树的最小深度(力扣111)

在这里插入图片描述

/*** 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 minDepth(TreeNode* root) {if(root==NULL) return 0;int leftDepth = minDepth(root->left);int rightDepth = minDepth(root->right);if (root->left == NULL && root->right != NULL) { return 1 + rightDepth;}   // 当一个右子树为空,左不为空,这时并不是最低点if (root->left != NULL && root->right == NULL) { return 1 + leftDepth;}return min(leftDepth,rightDepth)+1;}
};

在这里插入图片描述

四、完全二叉树的节点个数(力扣222)

在这里插入图片描述

/*** 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 countNodes(TreeNode* root) {int count=0;tr(root,count);return count;}void tr(TreeNode* root,int &count){if(root==NULL) return;tr(root->left,count);tr(root->right,count);count++;}
};

在这里插入图片描述

五、平衡二叉树(力扣110)

在这里插入图片描述

/*** 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:bool isBalanced(TreeNode* root) {if(root==NULL) return true;int result = getLength(root);if(result==-1) return false;return true;}int getLength(TreeNode* root){if(root==NULL) return 0;int leftLength = getLength(root->left);if(leftLength==-1) return -1;int rightLength = getLength(root->right);if(rightLength==-1) return -1;int result;if(abs(leftLength-rightLength)>1) return -1;else{result = max(rightLength,leftLength)+1;}return result;}
};

在这里插入图片描述

六、二叉树的所有路径(力扣257)

在这里插入图片描述

/*** 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> binaryTreePaths(TreeNode* root) {vector<string> result;vector<int> path;traversal(root,path,result);return result;}void traversal(TreeNode * root,vector<int>& path,vector<string> &result){path.push_back(root->val);if(root->left==NULL&&root->right==NULL) {string temp;for(int i=0;i<path.size();i++){if(i==path.size()-1){temp+= to_string(path[i]);}else{temp+=to_string(path[i]);temp+="->";}}result.push_back(temp);return;}if(root->left){traversal(root->left,path,result);path.pop_back();}if(root->right){traversal(root->right,path,result);path.pop_back();}}
};

在这里插入图片描述

七、左叶子之和(力扣404)

在这里插入图片描述

/*** 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 sumOfLeftLeaves(TreeNode* root) {int sum=0;return trv(root,sum);}// 后续遍历int trv(TreeNode *root,int &sum){if(root==NULL) return 0;trv(root->left,sum);trv(root->right,sum);if(root->left!=NULL&&root->left->left==NULL&&root->left->right==NULL){sum+= root->left->val;}return sum;}
};

在这里插入图片描述

八、找树左下角的值(513)

在这里插入图片描述

/*** 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 findBottomLeftValue(TreeNode* root) {vector<vector<int>> result = func(root);return result[result.size()-1][0];}// 层序遍历vector<vector<int>> func(TreeNode* root){vector<vector<int>> result;queue<TreeNode*> que;if(root!=NULL) que.push(root);while(!que.empty()){vector<int> vec;int Qsize=que.size();while(Qsize--){TreeNode * top = que.front();que.pop();vec.push_back(top->val);if(top->left) que.push(top->left);if(top->right) que.push(top->right);}result.push_back(vec);}return result;}
};

在这里插入图片描述

九、路径总和(力扣112)

在这里插入图片描述

/*** 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:bool hasPathSum(TreeNode* root, int targetSum) {vector<int> sumAll;vector<int> path;if(root==NULL) return false;traversal(root,path,sumAll);for(int i=0;i<sumAll.size();i++){if(sumAll[i]==targetSum){return true;}}return false;}void traversal(TreeNode*root,vector<int> &path,vector<int> &result){path.push_back(root->val);if(root->left==NULL&&root->right==NULL){int sum=0;for(int i=0;i<path.size();i++){sum+= path[i];}result.push_back(sum);}if(root->left) {traversal(root->left,path,result);path.pop_back();}if(root->right){traversal(root->right,path,result);path.pop_back();}}};

在这里插入图片描述

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

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

相关文章

AGI概念与实现

AGI AGI&#xff08;Artificial General Intelligence&#xff09;&#xff0c;中文名为“通用人工智能”或“强人工智能”&#xff0c;是指通过机器学习和数据分析等技术&#xff0c;使计算机具有类似于人类的认知和学习能力的技术. 多模态的大模型 &#xff08;Multimodal…

详细介绍如何用windows自带Hyper-V安装虚拟机(windows11和ubuntu22)

通过系统自带的hyper-v安装windows11&#xff0c;舒服又惬意&#xff0c;相比用第三方虚拟机软件速度快很多。 硬件准备 准备 系统需要符合能安装 Hyper-V 的最低要求windows版本含Hyper-V的功能 电脑空间 电脑要有足够的空间来安装你这个虚拟机。根据自己的磁盘容量情况来规…

2673. 使二叉树所有路径值相等的最小代价

给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#xff0c;树中每个非叶子节点 i 都有两个孩子&#xff0c;分别是左孩子 2 * i 和右孩子 2 * i 1 。 树中每个节点都有一个值&#xff0c;用下标从 0 开始、长度为 n 的整…

CloudCanal x Hive 构建高效的实时数仓

简述 CloudCanal 最近对于全周期数据流动进行了初步探索&#xff0c;打通了Hive 目标端的实时同步&#xff0c;为实时数仓的构建提供了支持&#xff0c;这篇文章简要做下分享。 基于临时表的增量合并方式基于 HDFS 文件写入方式临时表统一 Schema任务级的临时表 基于临时表的…

【Linux实践室】Linux初体验

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux 目录结构介绍2.2 &#x1f514;Linux …

WebFlux相关问题及答案(2024)

1、什么是Spring WebFlux&#xff1f; Spring WebFlux 是 Spring Framework 5.0 中引入的一个全新的反应式框架&#xff0c;用于构建异步、非阻塞且事件驱动的服务。它允许开发者使用响应式编程模型来处理并发性很高的操作&#xff0c;而无需担心传统的多线程环境中的复杂性。…

poi工具读写excel操作学习总结

写在前面的话 POI作为比较早期的Excel处理工具&#xff0c;其使用较为成熟且广泛。EasyExcel相较之下&#xff0c;则是相对较新的工具&#xff0c;其却有着比POI更为优越的一些特性&#xff0c;如更加简单的API接口和更加优秀的性能。 性能对比&#xff1a;在数据量较小的情况下…

mybatis mysql insert 主键id为空

错误示范 java代码设置了param参数&#xff0c;但是sql 字段没有带上参数&#xff0c;例如 void insertV2(Param("historyDO") HistoryDO historyDO); <insert id"insertDuplicate" parameterType"com.test.entity.HistoryDO"keyProperty&…

MySQL:一行记录如何

1、表空间文件结构 表空间由段「segment」、区「extent」、页「page」、行「row」组成&#xff0c;InnoDB存储引擎的逻辑存储结构大致如下图&#xff1a; 行 数据库表中的记录都是按「行」进行存放的&#xff0c;每行记录根据不同的行格式&#xff0c;有不同的存储结构。 页…

hippy 调试demo运行联调-mac环境准备篇

适用对于终端编译环境不熟悉的人看&#xff0c;仅mac端 hippy 调试文档官网地址 前提&#xff1a;请使用node16 联调预览效果图&#xff1a; 编译iOS Demo环境准备 未跑通&#xff0c;待补充 编译Android Demo环境准备 1、正常安装Android Studio 2、下载Android NDK&a…

Windows系统误删文件恢复

最近很多用户反馈误删文件的场景比较多.下面华仔将讲解数据恢复的原理和过程.以及一些注意事项。 建议的数据恢复软件 1.EaseUS Data Recovery Wizard(易我数据恢复)需要断网使用 2.Wondershare Recoverit(万兴数据恢复)&#xff0c; Windows系统删除文件原理&#xff1a;如果是…

Android ShellUtils手机管理器

1. Android ShellUtils手机管理器 Android Shell工具类&#xff0c;可用于检查系统root权限&#xff0c;并在shell或root用户下执行shell命令。如&#xff1a; checkRootPermission() 检查root权限 。execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg)…

HTTPS是什么,详解它的加密过程

目录 1.前言 2.两种加密解密方式 2.1对称加密 2.2非对称加密 3.HTTPS的加密过程 3.1针对明文的对称加密 3.2针对密钥的非对称加密 3.3证书的作用 1.前言 我们知道HTTP协议是超文本传输协议,它被广泛的应用在客户端服务器上,用来传输文字,图片,视频,js,html等.但是这种传…

java数据结构与算法刷题-----LeetCode572. 另一棵树的子树(经典题,树字符串化KMP)

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 暴力求解&#xff0c;深度优先2. KMP算法进行串匹配 1. 暴力求…

WinForm、Wpf自动升级 AutoUpdater.NET

Github AutoUpdater.NET 目录 一、IIS部署 更新站点 二、创建Winform 一、IIS部署 更新站点 IIS默认站点目录下创建 目录 Downloads、Updates Updates目录创建文件 UpdateLog.html、AutoUpdaterStarter.xml UpdateLog.html&#xff1a; <html><body><h1…

从零开始手写RPC框架(2)——Netty入门

学习前需要掌握基本的java网络编程&#xff0c;可参考这篇博客 目录 Netty 简介Netty 使用 kryo 序列化传输对象案例客户端代码服务端代码编码器 Netty 简介 是什么&#xff1f; Netty 是一个基于 NIO (Non-blocking I/O&#xff0c;非阻塞I/O)的 client-server(客户端服务器…

mysql学习--binlog与gtid主从同步

基础环境 基于centOS7-MySQL8.0.35版本 我们先准备一台主服务器两台从服务器来实现我们主从同步的诉求 Master&#xff1a;192.168.75.142 slave1:192.168.75.143 slave&#xff1a;192.168.75.145 binlog主从同步 主库配置 #我们需要在主从库中都需要添加server_id&am…

大龙谈智能内容开通视频号啦

大家好&#xff0c;大龙谈只能内容开通视频号了&#xff0c;欢迎大家扫码关注&#xff1a;

RISC-V特权架构 - 中断与异常概述

RISC-V特权架构 - 中断与异常概述 1 中断概述2 异常概述3 广义上的异常3.1 同步异常3.2 异步异常3.3 常见同步异常和异步异常 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断概述 中断&#xff08;Interrupt&#xff09;机制&#xff0c;即…

RocketMQ安装

mq服务端安装配置启动把windows做成服务 mq管理界面安装配置启动 mq服务端 安装 RocketMQ下载地址 配置 ROCKETMQ_HOME D:\google-d\rocketmq-all-5.2.0-bin-release启动 # bin目录cmd输入 start mqnamesrv.cmd把windows做成服务 http://t.csdnimg.cn/qd2RD mq管理界面 …