LeetCode 热题 100 | 二叉树(中下)

目录

1  基础知识

1.1  队列 queue

1.2  栈 stack

1.3  常用数据结构

1.4  排序

2  98. 验证二叉搜索树

3  230. 二叉搜索树中第 K 小的元素

4  199. 二叉树的右视图


菜鸟做题忘了第几周,躺平过了个年TT

1  基础知识

1.1  队列 queue
  1. queue<type> q:定义一个参数类型为 type 的队列
  2. q.push(variable):在队尾插入一个元素
  3. q.pop():删除队列第一个元素
  4. q.size():返回队列中元素个数
  5. q.empty():如果队列空则返回 true
  6. q.front():返回队列中的第一个元素
  7. q.back():返回队列中最后一个元素

1.2  栈 stack
  1. stack<type> s:定义一个参数类型为 type 的栈
  2. s.push(variable):压栈,无返回值
  3. s.emplace():压栈,无返回值(参见原文)
  4. s.pop():栈顶元素出栈,不返回元素,无返回值
  5. s.top():返回栈顶元素,该元素不出栈
  6. s.empty():判断栈是否为空,是返回 true
  7. s.size():返回栈中元素数量

参考博客:C++ 栈(stack)使用简述

1.3  常用数据结构
  • vector<type> v + push_back
  • unordered_set<type> s + insert
  • unordered_map<type, type> m

1.4  排序

总是忘记如何调用 sort()。。。

假设 vals 是一个容器。sort() 没有返回值,vals 里面就已经是排好的顺序了。

sort(vals.begin(), vals.end())

2  98. 验证二叉搜索树

题眼:

  • 节点左子树中的所有节点 比当前节点小
  • 节点右子树中的所有节点 比当前节点大

解题思路:

针对位于左子树的节点,判断它是否大于 leftMax;针对位于右子树的节点,判断它是否小于 rightMin;违反任一原则,都不是有效二叉搜索树。

思路说明图:

当前节点(蓝色)作为分界线,一是作为其左子树(绿色)所有节点的上限,二是作为其右子树(黄色)所有节点的下限。当处理到 “6” 这节点时,它同样地,一是作为其左子树(“3”)所有节点的上限,二是作为其右子树(“8”)所有节点的下限。

对于节点 “3”,它的下限是 “5”,上限是 “6”;对于节点 “8”,它的下限是 “6”,没有上限。

class Solution {
public:bool helper(TreeNode* root, long long leftMax, long long rightMin) {if (!root) return true;if (root->val >= leftMax || root->val <= rightMin) return false;return helper(root->left, root->val, rightMin)&& helper(root->right, leftMax, root->val);}bool isValidBST(TreeNode* root) {return helper(root, LONG_MAX, LONG_MIN);}
};

说明:什么是 LONG_MAX、LONG_MIN?

c++ 中最大值最小值的设定

3  230. 二叉搜索树中第 K 小的元素

解题思路:

  1. 遍历二叉树,将所有节点的数值存入一个数组中
  2. 使用 sort 对数组进行排序
  3. 返回 K - 1 号元素
class Solution {
public:vector<int> vals;void helper(TreeNode * root) {if (!root) return;vals.push_back(root->val);helper(root->left);helper(root->right);}int kthSmallest(TreeNode* root, int k) {helper(root);sort(vals.begin(), vals.end());return vals[k - 1];}
};

4  199. 二叉树的右视图

直接参照 102. 二叉树的层序遍历

解题思路:

  • 按 “层” 来遍历二叉树
  • 从右向左将同一层的节点的左右子节点插入到队列中
  • 在下一 “层” 循环中,队列将从右到左弹出下一 “层” 的所有节点
  • 将下一 “层” 的最右侧节点的值插入到数组中

思路说明:

首先将 “5” 插入到队列中。在 “5” 所处的 “层” 的循环中,弹出 “5”,依次将 “5” 的右子节点 “6” 和左子节点 “3” 插入到队列中。由于 “5” 是第一个弹出的节点,因此还要将其值插入到数组中。循环结束。接下来,在 “6” 所处的 “层” 的循环中,弹出 “6”,依次将 “6” 的右子节点和左子节点插入到队列中。由于 “6” 是第一个弹出的节点,因此还要将其值插入到数组中。再弹出 “3”,以此类推,……,直到循环结束。

class Solution {
public:vector<int> rightSideView(TreeNode* root) {if (!root) return {};vector<int> vals;queue<TreeNode *> q;q.push(root);while (!q.empty()) {int currentLevelSize = q.size();for (int i = 0; i < currentLevelSize; ++i) {TreeNode * node = q.front();q.pop();if (i == 0) vals.push_back(node->val);if (node->right) q.push(node->right);if (node->left) q.push(node->left);}}return vals;}
};

说明:以下代码用于判断当前节点是否是最右侧节点

if (i == 0)

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

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

相关文章

【基础】电容降压电路的特点及元器件选择

电容降压电路的特点及元器件选择 在电子制作时&#xff0c;为了减小体积、降低成本&#xff0c;往往采用电容降压的方法代替笨重的电源变压器。采用电容降压方法如元器件选择不当&#xff0c;不但达不到降压要求&#xff0c;还有可能造成电路损坏。本文从实际应用角度&#xf…

比特浏览器bit_selenium3bit_selenium4使用

bit_selenium3 from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from bit_api import *# /browser/open 接口会返回 selen…

Linux常用操作指令

Linux常用操作指令 ls 指令 语法&#xff1a;ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头…

RK3568平台 有线以太网接口之MAC芯片与PHY芯片

一.平台网络网络通路 平台有线以太网通路&#xff1a;有线以太网一般插入的是RJ45 座要与 PHY 芯片&#xff08;RTL8306M&#xff09;连接在一起&#xff0c;但是中间需要一个网络变压器&#xff0c;网络变压器经过模数转换后到达网卡(RTL8111)转换为帧数据后到达SOC。 二.网络…

内存计算研究进展-技术架构

内存计算技术是一个宏观的概念&#xff0c;是将计算能力集成到内存中的技术统称。集成了内存计算技术的计算机系统不仅能直接在内存中执行部分计算&#xff0c;还能支持传统以CPU为核心的应用程序的执行。区别于内存计算&#xff0c;存算一体芯片将存储与计算相结合&#xff0c…

【Java基础知识(1)】对象在内存中的存储

Java对象是如何在内存中存储的&#xff1f; 在Java中&#xff0c;所有的对象被动态地分配在堆中。这和C不同&#xff0c;C允许对象被存储在堆或者栈中。 参考Oracle官方文档&#xff1a;官方文档说明 在Java中创建字符串对象的2种方法&#xff1a; 1、 使用String关键字&am…

化学空间可视化(chemical space visualization)开源软件ChemPlot的安装及使用

文章目录 前言一、ChemPlot是什么&#xff1f;二、conda环境安装ChemPlot1. 创建conda环境2. 安装chemplot及需要的包3. 检验安装 三、使用步骤1. 化合物数据库可视化使用方法BBBP数据库的t-SNE降维后可视化&#xff1a;BBBP数据库的PCA降维后可视化&#xff1a;BBBP数据库的UM…

Photoshop 2023(Ps)下载安装及详细安装教程

Photoshop(Ps)的介绍 Adobe Photoshop&#xff0c;简称“PS”&#xff0c;是由AdobeSystems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具&#xff0c;可以有效地进行图片编辑和创造工作。PS有很多功能&#xff0c;在图像、…

如何用 Moodle 和 ONLYOFFICE 创建在线学习平台

在教学过程中使用现代在线学习软件&#xff0c;已不再是什么稀奇事。在世界各地&#xff0c;越来越多的教师和学生都在使用现代技术&#xff0c;应用新的学习场景&#xff0c;包括学生在传统课堂之外更积极的参与、更密切的互动。 Moodle 支持各类学校和大学充分利用在线教育过…

手持三防平板丨国产化加固平板丨国产三防平板发展的意义是什么?

随着现代科技的快速发展&#xff0c;平板电脑在我们的生活中扮演着越来越重要的角色。然而&#xff0c;传统的平板电脑只能在普通的环境中使用&#xff0c;而无法在恶劣的环境中使用&#xff0c;例如在高海拔、高温、高湿度、沙漠等环境中&#xff0c;传统平板电脑往往会出现故…

MacBook的nginx出现13: Permission denied 的问题分析和解决办法

同样的项目代码&#xff0c;电脑从Windows更换到了MacBook&#xff0c;发现网站的样式都没有了&#xff0c;直接访问CSS文件 http://crm.ms-test.cc/toolstatic/css/bootstrap.min.css 发现无法访问。查看Nginx错误日志&#xff1a; 说明是nginx没有权限访问这个CSS文件&#…

163邮箱发邮件

1、Jenkins安装Email Extension Plugin 2、网易邮箱里获取授权码:qa_jenkins_robot@163.com 开启POP3/SMTP 我已经配置过了,所以这里会有一个使用设备 3、配置Jenkins邮箱通知 Manage Jnekins-Configuration System Jenkins Location: Extended E-mail Notification: …