C++算法题 - 二叉树(2)

@TOC

114. 二叉树展开为链表

LeetCode_link


给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1
在这里插入图片描述
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

示例 2
输入:root = []
输出:[]

示例 3
输入:root = [0]
输出:[0]

提示
树中结点数在范围 [0, 2000]
-100 <= Node.val <= 100


思路:用栈进行先序遍历,让遍历过的节点成为空节点,即让父节点的指针变成null

/*** 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 flatten(TreeNode* root) {if(root==nullptr)   return;stack<TreeNode*> s;s.push(root);TreeNode* rec = new TreeNode(root->val, nullptr, nullptr);TreeNode* n = root, *end = rec, *temp;while(!s.empty()){if(n->left != nullptr){n = n->left;s.push(n);                         }else if(n->right != nullptr){n = n->right;s.push(n);}else{while(!s.empty() && n->left == nullptr && n->right == nullptr){temp = s.top();s.pop();if(!s.empty()) {n = s.top();if(n->left == temp){n->left = nullptr;}else if(n->right == temp){n->right = nullptr;}}}if(!s.empty()){ n = n->right;s.push(n);}}if(!s.empty()){TreeNode* new_node = new TreeNode(n->val, nullptr, nullptr);end->right = new_node;end = end->right;}}root->right = rec->right;}
};

112. 路径总和

LeetCode_link


给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false

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

示例 1
在这里插入图片描述
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2
在这里插入图片描述
输入:root = [1,2,3], targetSum = 5
输出:false
解释:树中存在两条根节点到叶子节点的路径:
(1 --> 2): 和为 3
(1 --> 3): 和为 4
不存在 sum = 5 的根节点到叶子节点的路径。

示例 3
输入:root = [], targetSum = 0
输出:false
解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示
树中节点的数目在范围 [0, 5000]
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 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:bool hasPathSum(TreeNode* root, int targetSum) {if(root == nullptr) return false;if(root->left == nullptr && root->right == nullptr){if(targetSum == root->val)  return true;else    return false;}bool left, right;if(root->left != nullptr){left = hasPathSum(root->left, targetSum - root->val);}if(root->right != nullptr){right = hasPathSum(root->right, targetSum - root->val);}return left || right;}
};

129. 求根节点到叶节点数字之和

LeetCode_link


给你一个二叉树的根节点 root ,树中每个节点都存放有一个 09 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。

计算从根节点到叶节点生成的 所有数字之和

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

示例 1
在这里插入图片描述
输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25

示例 2
在这里插入图片描述
输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026

提示
树中节点的数目在范围 [1, 1000] 内
0 <= Node.val <= 9
树的深度不超过 10


思路:递归

/*** 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 sumNumbers(TreeNode* root) {return number(root, 0);}int number(TreeNode* root, int n){if(root-> left == nullptr && root->right == nullptr)	return n + root->val;int left, right;if(root->left == nullptr)	left = 0;else	left = number(root->left, (n+root->val)*10);if(root->right == nullptr)	right = 0;else	right = number(root->right, (n+root->val)*10);return left + right;}
};

124. 二叉树中的最大路径和

LeetCode_link


二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和

示例 1
在这里插入图片描述
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

示例 2
在这里插入图片描述
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42

提示
树中节点数目范围是 [1, 3 * 10^4]
-1000 <= Node.val <= 1000


思路:递归,返回值是小于0,就不会将分支算入路径了

/*** 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 {
private:int maxnum = -1002;
public:int maxPathSum(TreeNode* root) {pathsum(root);return maxnum;}int pathsum(TreeNode* root){if(root == nullptr){return 0;}int left, right, val = root->val;left = max(pathsum(root->left), 0);right = max(pathsum(root->right), 0);int sum = left + right + val;maxnum = max(sum, maxnum);return val + max(left, right);}
};

173. 二叉搜索树迭代器

LeetCode_link


实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:

  • BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
  • boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false
  • int next()将指针向右移动,然后返回指针处的数字。

注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。

你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。

示例
在这里插入图片描述

输入
["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
输出
[null, 3, 7, true, 9, true, 15, true, 20, false]解释
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next();    // 返回 3
bSTIterator.next();    // 返回 7
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 9
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 15
bSTIterator.hasNext(); // 返回 True
bSTIterator.next();    // 返回 20
bSTIterator.hasNext(); // 返回 False

提示
树中节点的数目在范围 [1, 10^5]
0 <= Node.val <= 10^6
最多调用 10^5hasNextnext 操作


思路:递归建队列,用队列输出

/*** 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 BSTIterator {
private:queue<int> q;
public:BSTIterator(TreeNode* root) {push_stack(root);}void push_stack(TreeNode* root){if(root == nullptr){return;}push_stack(root->left);q.push(root->val);push_stack(root->right);}int next() {int now = q.front();q.pop();return now;}bool hasNext() {return !q.empty();}
};/*** Your BSTIterator object will be instantiated and called as such:* BSTIterator* obj = new BSTIterator(root);* int param_1 = obj->next();* bool param_2 = obj->hasNext();*/

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

LeetCode_link


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

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

示例 1
在这里插入图片描述
输入:root = [1,2,3,4,5,6]
输出:6

示例 2
输入:root = []
输出:0

示例 3
输入:root = [1]
输出:1

提示:
树中节点的数目范围是[0, 5 * 10^4]
0 <= Node.val <= 5 * 10^4
题目数据保证输入的树是 完全二叉树


思路:递归

/*** 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) {if(root == nullptr) return 0;return countNodes(root->left) + countNodes(root->right) + 1;}
};

236. 二叉树的最近公共祖先

LeetCode_link


给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1
在这里插入图片描述
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

示例 2
在这里插入图片描述
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3
输入:root = [1,2], p = 1, q = 2
输出:1

提示
树中节点数目在范围 [2, 10^5] 内。
-10^9 <= Node.val <= 10^9
所有 Node.val 互不相同 。
p != q
pq 均存在于给定的二叉树中。


思路


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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

已解决RuntimeError: CUDA error: invalid device ordinal 亲测有效!!!

已解决RuntimeError: CUDA error: invalid device ordinal 亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路解决方法 报错问题 当你尝试使用CUDA进行GPU加速计算时&#xff0c;可能会遇到以下错误&#xff1a; RuntimeError: CUDA error: invalid d…

为什么 ChatGPT 不火了?

不火了是有原因的&#xff0c;下面我来从大部分人拿到 ChatGPT 之后的两大痛点开始讲起&#xff1a; 很多朋友拿到 ChatGPT 后的第一个痛点就是&#xff1a;用的不好 你经常会感觉到 ChatGPT 回答的好空&#xff0c;没有太多参考价值。 而第二个痛点则是&#xff1a;无处去用…

HTML批量文件上传2——进度条显示

作者&#xff1a;私语茶馆 非常多的云应用中需要上传文本&#xff0c;包括图片&#xff0c;文件等等&#xff0c;这些批量文件上传&#xff0c;往往涉及到进度条显示&#xff0c;多文件上传等&#xff0c;这里分享一个非常好的案例&#xff0c;来自BootStrapfriendly.com&#…

C++ | Leetcode C++题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const au…

AI中转计费平台系统源码

AI中转计费平台系统源码 源码免费下载地址抄笔记 (chaobiji.cn)

ChIP-seq or CUTTag,谁能hold住蛋白质与DNA互作主战场?

DNA与蛋白质的相互作用作为表观遗传学中的一个重要领域&#xff0c;对理解基因表达调控、DNA复制与修复、表观遗传修饰&#xff08;组蛋白修饰&#xff09;及染色质结构等基本生命过程至关重要。 自1983年James Broach首次公布染色质免疫共沉淀&#xff08;ChIP&#xff09;技…

Ubuntu18.04 安装 anconda

anaconda官网 bash Anaconda3-2021.11-Linux-x86_64.sh一直回车&#xff0c;输入yes 选择安装目录 是否希望更新shell配置文件以自动初始化conda

STM32快速入门(定时器之输入捕获)

STM32快速入门&#xff08;定时器之输入捕获&#xff09; 前言 本节主要讲解STM32利用通用定时器&#xff0c;在输入引脚出现指定电平跳变时&#xff0c;将CNT的值锁存到CCR寄存器当中&#xff0c;从而计算PWM波形的频率、占空比、脉冲间隔、电平持续时间等。其功能的应用有&…

【转载】SAP MM培训事务代码

有需要的赶快收藏起来&#xff01;&#xff01;&#xff01;

4diacIDE同时编译不同版本踩坑记录

4diac不同版本依赖插件版本及jdk版本是不同的&#xff0c;当你需要搭建不同版本4diacIDE开发环境时&#xff0c;就会出现各种问题。最近一个月github上项目提交记录比较多&#xff0c;出现了不少坑。以下记录下此背景下的解决方法&#xff1a; 1、首先由于.target依赖的eclipse…

实战Java虚拟机-基础篇

JVM的组成 一、自动垃圾回收 1.Java的内存管理 Java中为了简化对象的释放&#xff0c;引入了自动的垃圾回收&#xff08;Garbage Collection简称GC&#xff09;机制。通过垃圾回收器来对不再使用的对象完成自动的回收&#xff0c;垃圾回收器主要负责对堆上的内存进行回收。其…

Win11任务栏通知很不明显的解决方案

Win11流行起来后&#xff0c;不少用户抱怨Win11的任务栏通知闪烁的颜色很不明显&#xff0c;经常微信来消息了看不到。虽然有右下角的微信图标会闪烁&#xff0c;但是提醒舒适度还是觉得不如Win10舒服显眼。 默认的颜色是这样子的&#xff0c;可以看得出Win11的任务栏提醒颜…

推荐5个AI工具平替GPT

随着AI技术的快速发展&#xff0c;AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头&#xff0c;国内很多小伙伴往往望而却步&#xff0c;究其原因&#xff0c;就是它的使用门槛高&#xff0c;还有成本的考量。 不过&#xff0c;随着GPT技术的火热&#xff0c;国内也涌…

Jetpack Compose(一

Intellij IDEA构建Android开发环境 IntelliJ IDEA 2023.2.1 Android开发变化 IDEA配置使用Gradle 新建Compose工程&#xff0c;取名ComposeStudy 可以看到的是IDEA为项目初始化了部分代码 使用Compose开发不再需要使用xml文件来设计布局了 Compose中的Text也不同于Android V…

JAVA语言程序设计1(第七章)

一、编程思想 1. 面向过程&#xff1a; (1) 面向过程&#xff1a;将问题分为第一步、第二步、第三步... 直到问题解决 (2) 问题&#xff1a;解决小业务相对比较简单&#xff0c;但是面对复杂业务时&#xff0c;相对不好处理 2. 面向对象&#xff1a; (1) 面向对象&#…

Windows10环境搭建http服务器

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

TikTok营销策略解析:7大关键要素打造品牌影响力

TikTok作为近年来迅速崛起的短视频社交平台&#xff0c;已经成为全球范围内品牌营销的重要阵地。对于品牌而言&#xff0c;如何在TikTok上有效地开展营销活动&#xff0c;吸引目标受众的注意力&#xff0c;提升品牌知名度和影响力&#xff0c;是摆在他们面前的重要课题。本文No…

联发科技发布天玑9300+旗舰5G生成式AI芯片 | 最新快讯

5 月 7 日消息&#xff0c;联发科技今天举办了天玑开发者大会 2024。大会上&#xff0c;联发科技开启了“天玑 AI 先锋计划”&#xff0c;联合业界生态企业发布了《生成式 AI 手机产业白皮书》&#xff0c;分享了生成式 AI 端侧部署的解决方案“天玑 AI 开发套件”。同时&#…

图片在线压缩,base64在线转换

图片在线压缩&#xff0c;超级好用 图片压缩 - 在线免费图片压缩软件-迅捷压缩在线迅捷免费在线图片压缩软件提供JPG压缩、PNG压缩、BMP压缩功能,为用户解决如何压缩图片的问题,实现一键压缩图片大小,是一款专业的高质量图片压缩工具.https://yasuo.xunjiepdf.com/img/ base64…

五道数组习题,只过思路

建议先过一遍&#xff1a;保研机试前的最后七道数组题-CSDN博客 第一题&#xff1a; 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; ​ 跟合并两个有序链表类似&#xff0c; 快慢指针的用法&#xff0c;新建立一个数组&#xff0c;再将数组赋给nums1。 第…