力扣hot100——二叉树

94. 二叉树的中序遍历

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> ans;stack<TreeNode*> stk;while (root || stk.size()) {while (root) {stk.push(root);root = root->left;}auto cur = stk.top();stk.pop();ans.push_back(cur->val);root = cur->right;}return ans;}
};
class Solution {
public:int maxDepth(TreeNode* root) {auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root == NULL) return 0;return max(dfs(root->left), dfs(root->right)) + 1;};return dfs(root);}
};

使用栈模拟

中序遍历本质是根在中,从左往右

因此一开始就先往左边找,找不到的情况下,说明可以往右边找了,然后又变成了一个子问题

104. 二叉树的最大深度

class Solution {
public:int maxDepth(TreeNode* root) {auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root == NULL) return 0;return max(dfs(root->left), dfs(root->right)) + 1;};return dfs(root);}
};

 经典模拟题

226. 翻转二叉树

class Solution {
public:TreeNode* invertTree(TreeNode* root) {auto dfs = [](this auto&& dfs, TreeNode* root) -> void {if (root == NULL) return;TreeNode* tmp = root->left;root->left = root->right;root->right = tmp;dfs(root->left);dfs(root->right);};dfs(root);return root;}
};
交换指针的时候注意tmp保存

101. 对称二叉树

class Solution {
public:bool isSymmetric(TreeNode* root) {auto dfs = [](this auto&& dfs, TreeNode* p1, TreeNode* p2) -> bool {if ((p1 && !p2) || (!p1 && p2) || (p1 && p2 && p1->val != p2->val)) return false;if (!p1 && !p2) return true;return dfs(p1->left, p2->right) && dfs(p1->right, p2->left);};return dfs(root->left, root->right);}
};

 模拟:分情况考虑即可

543. 二叉树的直径

class Solution {
public:int diameterOfBinaryTree(TreeNode* root) {int ans = 0;auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root->left && root->right) {int t1 = max(dfs(root->left), 0);int t2 = max(dfs(root->right), 0);int t = t1 + t2 + 1;ans = max(ans, t);return max(t1, t2) + 1;}else if (root->left) {int t = max(dfs(root->left), 0) + 1;ans = max(ans, t);return t;}else if (root->right) {int t = max(dfs(root->right), 0) + 1;ans = max(ans, t);return t;}else {ans = max(ans, 1);return 1;}};dfs(root);return ans - 1;}
};

 维护以root为根节点(包含在内)的单链最长 

 102. 二叉树的层序遍历

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> v(2000);if (root == NULL) return {};queue<pair<TreeNode*, int>> q;q.push({root, 0});while (q.size()) {pair<TreeNode*, int> now = q.front();q.pop();auto u = now.first;int dep = now.second;v[dep].push_back(u->val);if (u->left) {q.push({ u->left , dep + 1});}if (u->right) {q.push({ u->right , dep + 1});}}vector<vector<int>> ans;for (auto vec : v) {if (vec.size()) ans.push_back(vec);}return ans;}
};

 BFS记录深度

 108. 将有序数组转换为二叉搜索树

class Solution {
public:TreeNode* sortedArrayToBST(vector<int>& nums) {auto dfs = [&](this auto&& dfs,int l, int r) -> TreeNode* {if (l > r) return NULL;int mid = (l + r) / 2;TreeNode* root = new TreeNode(nums[mid]);root->left = dfs(l, mid - 1);root->right = dfs(mid + 1, r);return root;};return dfs(0, nums.size() - 1);}
};

利用中序遍历的有序性,每次选择中间节点作为根节点,划分子问题

98. 验证二叉搜索树

class Solution {
public:bool isValidBST(TreeNode* root) {auto dfs = [](this auto&& dfs, TreeNode* root, long long l, long long r) -> bool {if (root == NULL) return true;if (root->val <= l || root->val >= r) return false;return dfs(root->left, l, root->val) && dfs(root->right, root->val, r);};return dfs(root, LONG_MIN, LONG_MAX);}
};

函数表示考虑以 root 为根的子树,判断子树中所有节点的值是否都在 (l,r) 的范围内(注意是开区间)。同时注意开long long

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

class Solution {
public:int kthSmallest(TreeNode* root, int k) {// vector<int> v;int ans;auto dfs = [&](this auto&& dfs, TreeNode* root) -> bool {if (root == NULL) return false;if (dfs(root->left)) return true;k--;if (k == 0) {ans = root->val;return true;}return dfs(root->right);};dfs(root);return ans;}
};

利用平衡二叉树的中序遍历的有序性

199. 二叉树的右视图

class Solution {
public:vector<int> rightSideView(TreeNode* root) {if (root == NULL) return {};vector<int> ans;queue<TreeNode*> q;q.push(root);while (q.size()) {vector<TreeNode*> v;while (q.size()) {v.push_back(q.front());q.pop();}ans.push_back(q.back()->val);for (auto root : v) {if (root->left)q.push(root->left);if (root->right)q.push(root->right);}}return ans;}
};

 层序遍历每一层的最右边节点就是答案

114. 二叉树展开为链表

class Solution {
public:void flatten(TreeNode* root) {TreeNode* dummy = new TreeNode(0);TreeNode* cur = dummy;auto dfs = [&](this auto&& dfs, TreeNode* root) {if (root == NULL) return;cur->right = root;cur = cur->right;TreeNode* pl = root->left;TreeNode* pr = root->right;cur->left = NULL;cur->right = NULL;dfs(pl);dfs(pr);};dfs(root);}
};

先序遍历模拟

105. 从前序与中序遍历序列构造二叉树

class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int k = 0;map<int, int> mp;for (int i = 0; i < inorder.size(); i++)mp[inorder[i]] = i;auto dfs = [&](this auto&& dfs, int l, int r) -> TreeNode* {if (l > r) return NULL;TreeNode* root = new TreeNode(preorder[k++]);root->left = dfs(l, mp[root->val] - 1);root->right = dfs(mp[root->val] + 1, r);return root;};return dfs(0, inorder.size() - 1);}
};

只要我们在中序遍历中定位到根节点,那么我们就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的,因此我们就可以对应到前序遍历的结果中,对上述形式中的所有左右括号进行定位。

这样以来,我们就知道了左子树的前序遍历和中序遍历结果,以及右子树的前序遍历和中序遍历结果,我们就可以递归地对构造出左子树和右子树,再将这两颗子树接到根节点的左右位置。

每次递归构造的时候,当前先序遍历数组的当前第一个节点一定是当前子树的根节点

437. 路径总和 III

class Solution {
public:using ll = long long;int pathSum(TreeNode* root, ll targetSum) {map<ll, int> mp;ll ans = 0;mp[0]++;auto dfs = [&](this auto&& dfs, TreeNode* root, ll sum) {if (root == NULL) return;sum += root->val;ans += mp[sum - targetSum];mp[sum]++;dfs(root->left, sum);dfs(root->right, sum);mp[sum]--;};dfs(root, 0);return ans;}
};

哈希,dfs表示从根节点开始统计答案,并且结束后清除对map的影响的贡献

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

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {unordered_map<TreeNode*, int> dep;unordered_map<TreeNode*, TreeNode*> f;dep[NULL] = 0;auto dfs = [&](this auto&& dfs, TreeNode* root, TreeNode* fa) {if (root == NULL) return;dep[root] = dep[fa] + 1;f[root] = fa;dfs(root->left, root);dfs(root->right, root);};dfs(root, NULL);if (dep[p] < dep[q]) swap(p, q);while (dep[p] != dep[q]) {p = f[p];}if (p == q) return p;while (p != q) {p = f[p];q = f[q];}return p;}
};

贪心,先跳到同一层,再往上跳直到相同

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

class Solution {
public:int maxPathSum(TreeNode* root) {int ans = -1e9;auto dfs = [&](this auto&& dfs, TreeNode* root) -> int {if (root->left && root->right) {int t1 = max(dfs(root->left), 0);int t2 = max(dfs(root->right), 0);int t = t1 + t2 + root->val;ans = max(ans, t);return max(t1, t2) + root->val;}else if (root->left) {int t = max(dfs(root->left), 0) + root->val;ans = max(ans, t);return t;}else if (root->right) {int t = max(dfs(root->right), 0) + root->val;ans = max(ans, t);return t;}else {ans = max(ans, root->val);return root->val;}};dfs(root);return ans;}
};

贪心,dfs记录从root开始,单链的最大值

注意分类讨论取最大值

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

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

相关文章

设计模式 创建型 单例模式(Singleton Pattern)与 常见技术框架应用 解析

单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在确保某个类在应用程序的生命周期内只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。这种设计模式在需要控制资源访问、避免频繁创建和销毁对象的场景中尤为有用。 一、核心…

您的公司需要小型语言模型

当专用模型超越通用模型时 “越大越好”——这个原则在人工智能领域根深蒂固。每个月都有更大的模型诞生&#xff0c;参数越来越多。各家公司甚至为此建设价值100亿美元的AI数据中心。但这是唯一的方向吗&#xff1f; 在NeurIPS 2024大会上&#xff0c;OpenAI联合创始人伊利亚…

uniapp-vue3(下)

关联链接&#xff1a;uniapp-vue3&#xff08;上&#xff09; 文章目录 七、咸虾米壁纸项目实战7.1.咸虾米壁纸项目概述7.2.项目初始化公共目录和设计稿尺寸测量工具7.3.banner海报swiper轮播器7.4.使用swiper的纵向轮播做公告区域7.5.每日推荐滑动scroll-view布局7.6.组件具名…

使用 Python 实现随机中点位移法生成逼真的裂隙面

使用 Python 实现随机中点位移法生成逼真的裂隙面 一、随机中点位移法简介 1. 什么是随机中点位移法&#xff1f;2. 应用领域 二、 Python 代码实现 1. 导入必要的库2. 函数定义&#xff1a;随机中点位移法核心逻辑3. 设置随机数种子4. 初始化二维裂隙面5. 初始化网格的四个顶点…

mysql之组内排序ROW_NUMBER()函数

有个需求&#xff0c;需要组内排序&#xff0c;之前似乎从未接触过此类排序&#xff0c;故查询了一下&#xff0c;记录sql执行结果。 表如下&#xff1a; play_log: 日期 (fdate)用户 ID (user_id)歌曲 ID (song_id)2022-01-081000002022-01-161000002022-01-201000002022-0…

Android TV端弹出的PopupWindow没有获取焦点

在 TV 开发中&#xff0c;焦点管理是通过 Focus Navigation 实现的&#xff0c;PopupWindow 默认不接受焦点&#xff0c;导致遥控器无法选择弹窗内的控件。这是因为 PopupWindow 默认不会将焦点传递到其内容视图上。 要解决问题&#xff0c;可以通过以下步骤调整 PopupWindow …

活动预告 | Microsoft Power Platform 在线技术公开课:实现业务流程自动化

课程介绍 参加“Microsoft Power Platform 在线技术公开课&#xff1a;实现业务流程自动化”活动&#xff0c;了解如何更高效地开展业务。参加我们举办的本次免费培训活动&#xff0c;了解如何借助 Microsoft AI Builder 和 Power Automate 优化工作流。结合使用这些工具可以帮…

FPGA(二)组成结构基础内容

1. FPGA的基本结构 FPGA主要由以下部分组成&#xff1a; &#xff08;1&#xff09;可编程逻辑单元&#xff08;CLB&#xff09;&#xff1a;CLB是FPGA中最基本的逻辑单元&#xff0c;由查找表&#xff08;LUT&#xff09;和触发器组成&#xff0c;可实现任意逻辑功能。查找表…

LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作

近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展突飞猛进&#xff0c;逐步缩小了与通用人工智能&#xff08;AGI&#xff09;的差距。DeepSeek-AI 团队最新发布的 DeepSeek-V3&#xff0c;作为一款强大的混合专家模型&#xff08;Mixture-of-Experts, MoE&a…

el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)

好的&#xff0c;我来帮你分析前端为什么只能展示 10 条数据&#xff0c;以及如何解决这个问题。 问题分析&#xff1a; pageSize 的值&#xff1a; 你的 el-pagination 组件中&#xff0c;pageSize 的值被设置为 10&#xff1a;<el-pagination:current-page"current…

TCP网络编程(一)—— 服务器端模式和客户端模式

这篇文章将会编写基本的服务器网络程序&#xff0c;主要讲解服务器端和客户端代码的原理&#xff0c;至于网络名词很具体的概念&#xff0c;例如什么是TCP协议&#xff0c;不会过多涉及。 首先介绍一下TCP网络编程的两种模式&#xff1a;服务器端和客户端模式&#xff1a; 首先…

C# 设计模式(行为型模式):责任链模式

C# 设计模式&#xff08;行为型模式&#xff09;&#xff1a;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;用于让多个对象有机会处理同一个请求&#xff0c;避免请求发送者与接收者之间的耦合。它通过将请…

在K8S中,如何部署kubesphere?

在Kubernetes集群中&#xff0c;对于一些基础能力较弱的群体来说K8S控制面板操作存在一定的难度&#xff0c;此时kubesphere可以有效的解决这类难题。以下是部署kubesphere的操作步骤&#xff1a; 操作部署&#xff1a; 1. 部署nfs共享存储目录 yum -y install nfs-server e…

CSS系列(43)-- Anchor Positioning详解

前端技术探索系列&#xff1a;CSS Anchor Positioning详解 &#x1f3af; 致读者&#xff1a;探索智能定位的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Anchor Positioning&#xff0c;这个强大的元素定位特性。 基础概念 &#x1f680; 锚点设…

Python判别不同平台操作系统调用相应的动态库读写NFC

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bV0E4YV&ftt&id615391857885 import sys import struct # struct的pack函数把任意数据类型变成字符串 import ctypes # 调用DLL动态库要有这个引用if sys.platform…

树莓派之旅-第一天 系统的烧录和设置

自言自语&#xff1a; 在此记录一下树莓派的玩法。以后有钱了买点来玩啊草 系统的安装烧录 系统下载 树莓派官网&#xff1a;https://www.raspberrypi.com/ 首页点击SoftWare进入OS下载页面 这里是安装工具&#xff1a;安装工具负责将系统镜像安装到sd卡中 点击下载符合自己…

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…

人工智能及深度学习的一些题目

1、一个含有2个隐藏层的多层感知机&#xff08;MLP&#xff09;&#xff0c;神经元个数都为20&#xff0c;输入和输出节点分别由8和5个节点&#xff0c;这个网络有多少权重值&#xff1f; 答&#xff1a;在MLP中&#xff0c;权重是连接神经元的参数&#xff0c;每个连接都有一…

Solon 加入 GitCode:助力国产 Java 应用开发新飞跃

在当今数字化快速发展的时代&#xff0c;Java 应用开发框架不断演进&#xff0c;开发者们始终在寻找更快、更小、更简单的解决方案。近期&#xff0c;Solon 正式加入 GitCode&#xff0c;为广大 Java 开发者带来全新的开发体验&#xff0c;尤其是在国产应用开发进程中&#xff…

VScode 只能运行c,运行不了c++的解决问题

原文链接&#xff1a;Vscode只能运行c&#xff0c;运行不了c的解决方法 VScode 只能运行c&#xff0c;运行不了c&#xff0c;怎么回事呢&#xff0c;解决问题&#xff1a; 在tasks.json中加上“"-lstdc"”&#xff0c; 这样之后 要重启VScode&#xff0c;点击链接…