代码随想录1016-Day16

news/2024/11/22 7:59:13/

目录

  • 530.二叉搜索树的最小绝对差
  • 501.二叉搜索树中的众数
  • 105.从中序与前序遍历序列构造二叉树
    • 总结
  • 收获

530.二叉搜索树的最小绝对差

文章链接:代码随想录
题目链接:题目

思路:用中序遍历遍历一遍 BST 的所有节点得到有序结果,然后在遍历过程中计算最小差值即可
需要用一个pre节点记录一下cur节点的前一个节点:在递归中记录前一个节点的指针

    
/*** 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 res = INT_MAX;TreeNode * prev = nullptr;int getMinimumDifference(TreeNode* root) {traverse(root);return res;}void traverse(TreeNode* root){if(!root) return;traverse(root->left);if(prev){res = min(res, abs(root->val - prev->val));}prev = root;traverse(root->right);}
};

501.二叉搜索树中的众数

文章链接:代码随想录
题目链接:题目

思路:
这道题需要用到「遍历」的思维。

BST 的中序遍历有序,在中序遍历的位置做一些判断逻辑和操作有序数组差不多,很容易找出众数。
注意:
频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了

class Solution {
private:int maxCount = 0; // 最大频率int count = 0; // 统计频率TreeNode* pre = NULL;vector<int> result;void searchBST(TreeNode* cur) {if (cur == NULL) return ;searchBST(cur->left);       // 左// 中if (pre == NULL) { // 第一个节点count = 1;} else if (pre->val == cur->val) { // 与前一个节点数值相同count++;} else { // 与前一个节点数值不同count = 1;}pre = cur; // 更新上一个节点if (count == maxCount) { // 如果和最大值相同,放进result中result.push_back(cur->val);}if (count > maxCount) { // 如果计数大于最大值频率maxCount = count;   // 更新最大频率result.clear();     // 很关键的一步,不要忘记清空result,之前result里的元素都失效了result.push_back(cur->val);}searchBST(cur->right);      // 右return ;}public:vector<int> findMode(TreeNode* root) {count = 0;maxCount = 0;pre = NULL; // 记录前一个节点result.clear();searchBST(root);return result;}
};

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

文章链接:代码随想录
题目链接:题目

思路:
构造二叉树,第一件事一定是找根节点,然后想办法构造左右子树。
在这里插入图片描述

二叉树的前序和中序遍历结果的特点如下:

在这里插入图片描述

前序遍历结果第一个就是根节点的值,然后再根据中序遍历结果确定左右子树的节点。

/*** 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:unordered_map<int, int> hash;TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {for (int i = 0; i < inorder.size(); i++){hash[inorder[i]] = i;}return buildTree(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);}TreeNode* buildTree(vector<int>&preorder,int pl, int pr, vector<int>& inorder, int il, int ir){if(pl > pr) return nullptr;auto val = preorder[pl];//根据前序遍历的值 从哈希表中找到对应中序遍历的下标int k = hash[val];int lLength = k - il;TreeNode* root = new TreeNode(val);//pl + lLength有点没懂 //k - 1 - il// pl + 1 + k - 1 - il =>pl + k - il => pl + kroot->left = buildTree(preorder, pl + 1, pl + lLength, inorder, il, k - 1);root->right = buildTree(preorder, pl + lLength + 1, pr, inorder, k + 1, ir);return root;}
};

总结

二叉树解题的思维模式分两类:

1、是否可以通过遍历一遍二叉树得到答案?如果可以,用一个 traverse 函数配合外部变量来实现,这叫「遍历」的思维模式。

2、是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。

无论使用哪种思维模式,你都需要思考:

如果单独抽出一个二叉树节点,它需要做什么事情?需要在什么时候(前/中/后序位置)做?其他的节点不用你操心,递归函数会帮你在所有节点上执行相同的操作。

收获

补之前的卡


http://www.ppmy.cn/news/1548981.html

相关文章

持续集成与持续部署:CI/CD实现教程

以下是一个基于常见工具实现 CI/CD 的基本教程示例&#xff0c;这里以 Git、Jenkins、Maven&#xff08;用于 Java 项目构建和管理依赖&#xff0c;其他语言项目可替换为对应构建工具&#xff09;以及 Docker&#xff08;用于容器化部署&#xff0c;非必需但很常用&#xff09;…

如何提取视频里的音乐?视频音频提取指南

在如今的数字时代&#xff0c;视频与音乐的结合为我们带来了丰富多彩的视听体验。有时候&#xff0c;我们会被视频中的某段背景音乐深深吸引&#xff0c;想要将其提取出来单独欣赏或用于其他创作。 那么&#xff0c;如何提取视频里的音乐呢&#xff1f;本文将为大家介绍几种简…

数据结构-二叉树_堆

目录 1.二叉树的概念 ​编辑1.1树的概念与结构 1.2树的相关语 1.3 树的表示 2. ⼆叉树 2.1 概念与结构 2.2 特殊的⼆叉树 2.2.2 完全⼆叉树 2.3 ⼆叉树存储结构 2.3.1 顺序结构 2.3.2 链式结构 3. 实现顺序结构⼆叉树 3.2 堆的实现 3.2.2 向下调整算法 1.二叉树的概…

使用 Go 实现将任何网页转化为 PDF

在许多应用场景中&#xff0c;可能需要将网页内容转化为 PDF 格式&#xff0c;比如保存网页内容、生成报告、或者创建网站截图。使用 Go 编程语言&#xff0c;结合一些现有的库&#xff0c;可以非常方便地实现这一功能。本文将带你一步一步地介绍如何使用 Go 语言将任何网页转换…

【初阶数据结构与算法】线性表之队列的定义与实现

文章目录 一、队列的概念与结构1. 概念2.队列结构定义 二、队列的实现1.队列的初始化和销毁初始化销毁 2.队列的节点申请和入队列操作队列的节点申请入队列 3.队列的判空和出队列操作队列的判空出队列 4.取队头和队尾元素取队头元素取队尾元素 5.获取队列有效节点个数 三、队列…

【MogDB】MogDB5.2.0重磅发布第八篇-支持PLSQL编译全局缓存

前言 在我之前的文章中有提过&#xff0c;原生PG对于重度存储过程的应用系统适配&#xff0c;具有一个致命缺陷&#xff0c;即原生PG中的plsql是会话级缓存&#xff0c;这意味着每个会话在第一次执行某个存储过程时&#xff0c;都需要对这个存储过程进行编译&#xff0c;并且将…

.NET9 - 新功能体验(一)

被微软形容为“迄今为止最高效、最现代、最安全、最智能、性能最高的.NET版本”——.NET 9已经发布有一周了&#xff0c;今天想和大家一起体验一下新功能。 此次.NET 9在性能、安全性和功能等方面进行了大量改进&#xff0c;包含了数千项的修改&#xff0c;今天主要和大家一起体…

力扣 无重复字符的最长字串-3

无重复字符的最长字串-3 class Solution { public:// 解决方法&#xff1a;双指针int lengthOfLongestSubstring(string s) { // 如果字符串为空&#xff0c;直接返回0if (s.length() 0)return 0;// 如果字符串不为空&#xff0c;字符串每个字符都不同的情况下&#xff0c;最…