LeetCode 刷题 -- Day 7

今日题目

题目难度备注
226. 翻转二叉树 简单
101. 对称二叉树简单
222. 完全二叉树的节点个数 简单⭐⭐⭐
110. 平衡二叉树 简单⭐⭐⭐
257. 二叉树的所有路径简单代码优化能力

树篇 Ⅱ

  • 今日题目
  • 题目:226. 翻转二叉树
    • 一、源代码
    • 二、代码思路
  • 题目:101. 对称二叉树
    • 一、源代码
    • 二、代码思路
    • 三、优化代码
  • 题目:222. 完全二叉树的节点个数
    • 一、源代码
    • 二、代码思路
    • 三、优化思路
    • 四、优化代码
  • 题目:110. 平衡二叉树
    • 一、源代码
    • 二、代码思路
    • 三、优化思路
    • 四、优化代码
  • 题目:257. 二叉树的所有路径
    • 一、源代码
    • 二、代码思路
    • 三、优化思路
    • 四、优化代码

题目:226. 翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode)

一、源代码

class Solution {
private:void DFS(TreeNode* root) {if (!root) return;                         // 为空指针结束if (root->left || root->right) {           // 左孩子或者右孩子不为空则交换左右孩子swap(root->left,root->right);}DFS(root->left);DFS(root->right);}
public:TreeNode* invertTree(TreeNode* root) {DFS(root);return root;}
};

二、代码思路

​ 先序遍历二叉树,若访问到空指针则结束,若访问结点的左孩子或者右孩子不为空则交换左右孩子。


题目:101. 对称二叉树

101. 对称二叉树 - 力扣(LeetCode)

一、源代码

class Solution {
private:bool isSym(TreeNode* root1, TreeNode* root2) {if (!root1 && !root2) return true;if ((root1 && !root2) || (!root1 && root2)) return false;if (root1->val != root2->val) return false;bool l = isSym(root1->left,root2->right);       // 判断root1 和 root2 的孩子结点对称否bool r = isSym(root1->right,root2->left);if (!l || !r) return false;return true;}
public:bool isSymmetric(TreeNode* root) {return isSym(root->left,root->right);}
};

二、代码思路

递归判断,每次处理一层。对每一层:

① 如果root1 和 root2 都为空,则对称。

② 如果 root1 和 root2 一个为空,一个不为空,则不对称。

③ 如果 root1 和 root2 的孩子结点不对称,则不对称。

三、优化代码

    bool isSym(TreeNode* root1, TreeNode* root2) {if (!root1 && !root2) return true;if (!root1 || !root2) return false;return root1->val == root2->val && isSym(root1->left,root2->right) && isSym(root1->right,root2->left);}

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

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

一、源代码

class Solution {
private:int BFS(TreeNode* root) {if (!root) return 0;queue<TreeNode*> q;q.push(root);int cnt = 0;while(!q.empty()) {TreeNode* now = q.front();q.pop();++cnt;if (now->left)  q.push(now->left);if (now->right) q.push(now->right);}return cnt;}
public:int countNodes(TreeNode* root) {return BFS(root);}
};

二、代码思路

​ BFS 遍历树,记录结点数

三、优化思路

​ 因为为完全二叉树,所以最多只有一个非满二叉子树,其余都是满二叉子树。所以只需判断当前节点引导的子树是不是满二叉树,是的话直接返回子树的结点,不是的话就往下遍历。此时间复杂度为 O(logn ^ 2)

四、优化代码

class Solution {
public:int countNodes(TreeNode* root) {if (!root) return 0;int lDepth = 0;int rDepth = 0;TreeNode* node = root;while (node->left) {           // 获取左子树高度lDepth += 1;node = node->left;}node = root;while (node->right) {          // 获取右子树高度 rDepth += 1; node = node->right;}if (lDepth == rDepth) {        // 如果左子树高度等于右子树高度 说明为满二叉树,则直接返回 结点数return (int)pow(2, lDepth + 1) - 1;}else {                        // 否则返回左子树结点 + 右子树结点 + 1return countNodes(root->left) + countNodes(root->right) + 1;    }}
};

题目:110. 平衡二叉树

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

一、源代码

class Solution {int getHight(TreeNode* root,int h) {if (!root) return h;int l = getHight(root->left,h+1);int r = getHight(root->right,h+1);return l > r ? l : r;}
public:bool isBal = true;bool isBalanced(TreeNode* root) {if (!root) return true;if (abs(getHight(root->left, 0) - getHight(root->right, 0)) > 1) isBal = false;isBalanced(root->left);isBalanced(root->right);return isBal;}
};// 可优化写成int getHight(TreeNode* root) {if (!root) return 0;return max(getHight(root->left), getHight(root->right)) + 1;}bool isBalanced(TreeNode* root) {if (!root) return true;else return abs(getHight(root->left) - getHight(root->right)) <= 1)&& isBalanced(root->left) &&  isBalanced(root->right);}

二、代码思路

​ 自顶向下遍历树的各结点(先序遍历),对每一结点,判断左右子树的高度差是否小于等于 1

三、优化思路

​ 自顶向下递归,因此对于同一个节点,函数 getHight 会被重复调用,导致时间复杂度较高。如果使用自底向上的做法(后序遍历),则对于每个节点,函数 getHight只会被调用一次。

先序遍历不管怎么样都会计算一遍再说,后序遍历可以口口相传及时止损

四、优化代码

class Solution {
public:int height(TreeNode* root) {          // 通过返回的高度判断是否为平衡二叉树,若为则返回高度,否则返回-1if (root == NULL) {return 0;}int leftHeight = height(root->left);         // 后序遍历int rightHeight = height(root->right);if (leftHeight == -1 || rightHeight == -1 || abs(leftHeight - rightHeight) > 1) {return -1;         // 左子树或右子树非平衡二叉树,或者该结点引导的二叉树非平衡,则返回 -1;} else {return max(leftHeight, rightHeight) + 1;       // 否则返回 当前结点高度}}bool isBalanced(TreeNode* root) {return height(root) >= 0;}
};

题目:257. 二叉树的所有路径

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

一、源代码

class Solution {
private:vector<vector<int>> ans;void DFS(TreeNode* root,vector<int> vi) {          // 遍历树,并记录各从根节点到叶子节点的路径上的结点if (!root) return;vi.push_back(root->val);if (!root->left && !root->right) {ans.push_back(vi);}if (root->left)   DFS(root->left, vi);if (root->right)  DFS(root->right, vi);}
public:vector<string> binaryTreePaths(TreeNode* root) {vector<int> vi;vector<string> res;DFS(root,vi);for (int i = 0; i < ans.size(); i++) {       // 获取路径,并存入 vector<string>  中string rode = "";for (int j = 0; j < ans[i].size(); j++) {rode += to_string(ans[i][j]);if (j < ans[i].size() - 1) {rode += "->";}}res.push_back(rode);}return res;}
};

二、代码思路

​ 利用 DFS 遍历树,并记录各从根节点到叶子节点的路径上的结点。然后访问结点获取路径,并存入 vector<string> 中。

三、优化思路

​ 先是vector<vector<int>> ans 数组存各路径的结点,然后遍历ans 数组取出各结点形成路径,这太麻烦了。为什么不直接形成路径,然后存起来呢?这就不用定义vector<vector<int>> ans 数组了。时间复杂度和空间复杂度都会得到减少。

四、优化代码

class Solution {
public:void construct_paths(TreeNode* root, string path, vector<string>& paths) {if (root != nullptr) {path += to_string(root->val);if (root->left == nullptr && root->right == nullptr) {  // 当前节点是叶子节点paths.push_back(path);                              // 把路径加入到答案中} else {path += "->";  // 当前节点不是叶子节点,继续递归遍历construct_paths(root->left, path, paths);construct_paths(root->right, path, paths);}}}vector<string> binaryTreePaths(TreeNode* root) {vector<string> paths;construct_paths(root, "", paths);return paths;}
};

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

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

相关文章

Chrome 插件如何开发?

开发 Chrome 插件涉及几个关键步骤&#xff0c;包括了解 Chrome 插件的架构、编写必要的代码、测试和发布。以下是开发 Chrome 插件的基本流程&#xff1a; 1. 了解 Chrome 插件的基础知识&#xff1a; - Chrome 插件通常由 HTML、CSS 和 JavaScript 文件组成。 - 它们可…

curl_opt参数解析

curl_opt参数概述 curl --version curl 7.81.0 (x86_64-pc-linux-gnu) 下载地址 &#xff1a; https://curl.se/download/ CURLOPT_WRITEDATA: 用于设置接收数据的回调函数所需的参数。通常是一个指针&#xff0c;指向接收到的数据将被写入的位置。 CURLOPT_URL: 设置请求的 U…

Leetcode - 周赛395

目录 一&#xff0c;3131. 找出与数组相加的整数 I 二&#xff0c;3132. 找出与数组相加的整数 II 三&#xff0c;3133. 数组最后一个元素的最小值 四&#xff0c;3134. 找出唯一性数组的中位数 一&#xff0c;3131. 找出与数组相加的整数 I 本题本质就是求两个数组最小值的…

[iOS]组件化开发

一、组件化开发基础 1.组件定义 在软件开发中&#xff0c;一个组件是指一个独立的、可替换的软件单元&#xff0c;它封装了一组相关的功能。组件通过定义的接口与外界交互&#xff0c;并且这些接口隔离了组件内部的实现细节。在Swift语言中&#xff0c;组件可以是一个模块、一…

文献速递:肺癌早期诊断---低剂量胸部计算机断层扫描上的三维深度学习端到端肺癌筛查

Title 题目 End-to-end lung cancer screening with three-dimensional deep learning on low-dose chest computed tomography 低剂量胸部计算机断层扫描上的三维深度学习端到端肺癌筛查 01文献速递介绍 2018年估计有160,000例死亡病例&#xff0c;肺癌是美国最常见的癌症…

青少年软件编程(Scratch一级)等级考试试卷(2019年12月)

客观题 题目总数&#xff1a;35 总分数&#xff1a;70 时间&#xff1a;不限时 CSDN添加图片自带水印&#xff0c;可至文末获取无水印版word文档 第 1 题 单选题 下列关于舞台的描述&#xff0c;不正确的是&#xff1f;&#xff08; &#xff09; A.Scratch只能…

MVVM框架

LifeCycle 翻译为生命周期。意义就是为了监控某个事件的生命周期。 此处用了addObserver函数&#xff0c;代表添加监控者。监控该activity的变化。activity的状态有onCreate,onStop,onDestory等&#xff0c;该函数表示对所有状态进行监听。 该方法使用了标签的方法&#xff0c…

护航智慧交通安全 | 聚铭精彩亮相2024交通科技创新及信创产品推广交流会

4月26日&#xff0c;石家庄希尔顿酒店内&#xff0c;河北省智能交通协会盛大举办2024年度交通科技创新及信创产品推广交流会。聚铭网络受邀参与&#xff0c;携旗下安全产品及解决方案精彩亮相&#xff0c;为智慧交通安全保驾护航。 为深化高速公路创新驱动发展战略&#xff0…

vue3中的reactive、readonly和shallowReactive

在 Vue 3 中&#xff0c;reactive、readonly 和 shallowReactive 是用于创建响应式对象的函数&#xff0c;它们可以帮助管理组件状态和数据流。下面是它们的详细介绍以及相应的代码示例&#xff1a; reactive: reactive 函数用于创建一个完全响应式的对象&#xff0c;当对象的属…

2024 java easyexcel poi word模板填充数据,多个word合成一个word

先看效果 一、准备工作 1.word模版 2.文件路径 二、pom依赖 <!-- easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></dependency><depe…

商城数据库88张表结构(九)

DDL 33.商品举报表 CREATE TABLE wang_informs (informid int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,informTargetid int(11) NOT NULL COMMENT 举报人ID,goodid int(11) NOT NULL COMMENT 被举报商品ID,shopid int(11) NOT NULL COMMENT 被举报店铺ID,informType int(…

如何申请免费SSL证书,把网站升级成HTTPS

HTTPS&#xff08;Hyper Text Transfer Protocol Secure&#xff09;是一种用于安全数据传输的网络协议&#xff0c;它可以有效地保护网站和用户之间的通信安全。然而&#xff0c;要使一个网站从HTTP升级到HTTPS&#xff0c;就需要一个SSL证书。那么&#xff0c;如何申请免费的…

一文解读 SQL 生成工具

SQL 生成工具可用于测试 Parser 与其他数据库产品的兼容性&#xff0c;通过解析 YACC 语法文件中的产生式&#xff0c;生成对应的 SQL 语句&#xff0c;再使用数据库执行该 SQL&#xff0c;根据结果判断语句是否与其他数据库语法兼容。 01工具使用 语法文件预处理 预处理目的…

notion使用小tip(待补充)

可以替代思维导图是一个很棒的软件 公式编辑&#xff1a;latex 网站链接&#xff1a;LATEX语法 一些常用的用法&#xff1a; 下标&#xff1a;a_{Si} 分数&#xff1a;\frac{}{} 乘&#xff1a;\times 向量&#xff1a;\vec{} pai (3.14159…) : \pi 直接用公式编辑器&#…

MATLAB使用贝叶斯网络bnt工具箱:使用手册详解

MATLAB构建贝叶斯网络bnt工具箱: 贝叶斯网络(Bayesian networks)相关网页资源介绍1 工具包安装2 创建贝叶斯网络2.1 图结构(Graph structure)2.2 创建贝叶斯网络外壳(Creating the Bayes net shell)2.3 创建贝叶斯网络2.3 参数2.4 随机参数2 推断(Inference)2.1 边缘分…

【kettle005】kettle访问Oracle数据库并处理数据至execl文件(已更新)

1.一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下Oracle数据库相关知识体系 3.欢迎批评指正&#xff0c;跪谢一键三连&am…

全栈从0到1 3D旅游地图标记和轨迹生成

功能演示 演示视频 体验地址 Vercel App 开发技术栈&#xff1a; NextJs&#xff08;前端框架&#xff09;React&#xff08;前端框架&#xff09;TailwindCSS &#xff08;CSS样式&#xff09;echart echart gl &#xff08;地图生成&#xff09;shadui&#xff08;UI组件…

Nginx自定义状态码499出现原因

499状态码定义 维基百科的定义 499 Client Closed Request (Nginx) Used in Nginx logs to indicate when the connection has been closed by client while the server is still processing itsrequest, making server unable to send a status code back 499状态码是nginx自…

Vue2 和 Vue3 的区别 (性能,编码方式,API 特性,源码)

在这个快节奏的时代&#xff0c;技术更新换代的速度也越来越快。我一直在使用Vue 2来开发项目。然而&#xff0c;现在越来越多的公司转向了Vue 3&#xff0c;并将其作为主要的前端开发框架。这就需要我们及时跟进新技术的发展&#xff0c;以保持竞争力。因此&#xff0c;我决定…

C语言阶段性测试错题纠正与拓展

引言&#xff1a;在2024年4月26日&#xff0c;我进行了C语言知识的“期末考试”。通过这次考试&#xff0c;我发现了我的知识漏洞。所以&#xff0c;我写下这篇博客来记录我的错题&#xff0c;并进行纠正&#xff0c;然后对于以前遗忘知识的回顾。 更多有关C语言的知识详解可前…