代码随想录打卡—day21—【二叉树】— 8.21

news2024/9/23 9:36:35

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

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

想法:先直接中序遍历(升序的序列)过程中相邻两个数的差值取min,自己写一次AC代码:

/**
 * 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 min_ans;
    int ok = 0;   //全局遍历 第一个元素特殊处理!
    TreeNode* old;   //全局遍历!
    int search(TreeNode* root)  // 返回前一个节点的val
    {
        if(!root) return root->val;
        
        int ans1 = 0xffff;
        int ans2 = 0xffff;

        if(root->left)ans1 = search(root->left);

        int tmpval = root->val;
        cout << tmpval << endl;
        if(ok)min_ans = min(min_ans,abs(tmpval - old->val));
        old = root;
        ok=1;

        if(root->right)ans2 = search(root->right);
        
        return tmpval;
    }

    int getMinimumDifference(TreeNode* root) 
    {
        // 想法:先直接中序遍历(升序的序列)相邻两个数的差值取min
        min_ans = INT_MAX;
        ok=0;
        search(root);
        return min_ans;
    }
};


看了题解,思路和我的一样,但是写法更加简单(设置old起始为null,非null表示非第一次,并且后一步每次都更新old ),学习并写一遍AC代码:

/**
 * 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 ans = INT_MAX;
    TreeNode* old =  NULL;
    void search(TreeNode* root)
    {
        if(root == NULL)return;
        search(root->left);
        if(old)
            ans = min(ans,abs(root->val - old->val));
        old = root;
        search(root->right);
    }
    int getMinimumDifference(TreeNode* root) {
        search(root);
        return ans;
    }
};

 2 501. 二叉搜索树中的众数

501. 二叉搜索树中的众数

如果拿一个数组存中序遍历结果很容易,但是题目进阶要求:不要额外的空间。有一些麻烦的思路,比如全局变量维护max的值与数目,每次函数都传递当前值和数目的参数(题解证明不用传参 直接全局变量更新新的cnt即可),不确定能不能实现,然后看题解:

  • 知道了普通二叉树的做法时候:最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序(有的同学可能可以想直接对map中的value排序,还真做不到,C++中如果使用std::map或者std::multimap可以对key排序,但不能对value排序。所以要把map转化数组即vector,再进行排序,当然vector里面放的也是pair<int, int>类型的数据,第一个int为元素,第二个int为出现频率。),最后取前面高频的元素的集合。
  • 在递归遍历二叉搜索树的过程中,介绍了一个统计最高出现频率元素集合的技巧, 要不然就要遍历两次二叉搜索树才能把这个最高出现频率元素的集合求出来。为什么没有这个技巧一定要遍历两次呢? 因为要求的是集合,会有多个众数,如果规定只有一个众数,那么就遍历一次稳稳的了。和我的思路差不多,就是把我模糊的想法落地了。

/**
 * 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 cnt = INT_MIN;
    int maxcnt = INT_MIN;

    TreeNode* old = NULL;
    vector<int> ans;
    void search(TreeNode* root)
    {
        if(root == NULL)return;
        search(root->left);
        // 计算当前cnt
        if(!old)cnt = 1;
        else
        {
            if(root->val == old->val)
                cnt++;
            else  //新的元素
                cnt = 1;
        }
        // 计算最大的cnt 和 更新结果
        if(cnt > maxcnt)
        {
            maxcnt = cnt;
            ans.clear();
            ans.push_back(root->val);
        }
        else if(cnt == maxcnt)ans.push_back(root->val);

        old = root;

        search(root->right);

    }
    vector<int> findMode(TreeNode* root) 
    {
        search(root);
        return ans;
    }
};

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

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

我一开始写了一个递归的版本,其实只用了递归但没有迭代,结果在第29个测试点超出内存限制,不知道是不是TLE,如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<TreeNode*>> ans;
    void search(TreeNode* root, TreeNode* p, TreeNode* q,vector<TreeNode*> path)
    {
        if(root == p || root == q)  // 获得结果并不return
            ans.push_back(path);

        if(!root->left && !root->right)
            return;
        
        path.push_back(root->left);
        if(root->left)search(root->left,p,q,path);
        path.pop_back();

        path.push_back(root->right);
        if(root->right)search(root->right,p,q,path);
        path.pop_back();

    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //我的思路 写一个函数找到p和q的祖宗路线存在来然后对比两个序列即可。
        vector<TreeNode*> path;
        path.push_back(root);
        search(root , p , q ,path);

        int i = 0;
        for(; i < ans[0].size();i++)
            if(ans[0][i] != ans[1][i])
                return ans[0][i-1];

        return ans[0][i-1];
    }
};

看了题解,正确的思路应该是不止递归,更要好好用到回溯==》后序遍历,基本逻辑是:

  • 如果当前节点是p,是q,或者是空直接返回当前节点。(想象如果p是q的父节点 这里的直接return也是满足要求的!!!)
  • 后序遍历后:
  1. 左子树如果没有pq,右子树也没有pq,就return 空
  2. 左子树如果没有pq,右子树有pq,就返回右子树的结果
  3. 左子树如果有pq,右子树没有pq,就返回左子树的结果
  4. 左右都有的话,说明当前节点就是最近的公共父节点!!!!!!!

我感觉这个写法还是比较妙的写法,有一些一个变量表达2个含义的感觉,没有冗余的东西AC代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* search(TreeNode* root, TreeNode* p, TreeNode* q)
    {
        if(root == p || root == q || root == NULL)  // 获得结果并不return
            return root;
        
        TreeNode* left = search(root->left,p,q);
        TreeNode* right = search(root->right,p,q);

        if(left && right)return root;
        else if(left && !right)return left;
        else if(!left && right)return right;
        else return NULL;
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {

        return search(root , p , q );
    }
};

总结:

这一节累计用时2h。


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

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

相关文章

JMETER基本原理

Jmeter基本原理是建立一个线程池&#xff0c;多线程运行取样器产生大量负载&#xff0c;在运行过程中通过断言来验证结果的正确性&#xff0c;可以通过监听来记录测试结果&#xff1b; JMETER是运行在JVM虚拟机上的&#xff0c;每个进程的开销比loadrunner的进程开销大&#x…

基于springboot+vue的食材商城(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

ChatGLM的int8量化以及由此对量化的梳理总结

目录 一、ChatGLM的int8量化 二、全流程量化 三、量化校准 目前随着模型规模越来越大&#xff0c;对于没有很多算力的人来说&#xff0c;使用大模型的门槛越来越高&#xff0c;因此ChatGLM提供的模型支持&#xff0c;fp16、int8和int4的量化&#xff0c;来降低加载模型的显存…

Dockerfile制作Nginx应用镜像

文章目录 使用Dockerfile制作基于Centos7的Nginx应用镜像创建Dockerfile创建镜像上传镜像-harbor修改hosts文件修改daemon.json重启DOCKER登录并上传测试镜像 使用Dockerfile制作基于Centos7的Nginx应用镜像 创建Dockerfile FROM centos:7 MAINTAINER "WWW" RUN yu…

多维时序 | MATLAB实现SCNGO-BiLSTM-Attention多变量时间序列预测

多维时序 | MATLAB实现SCNGO-BiLSTM-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现SCNGO-BiLSTM-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现SCNGO-BiLSTM-Attention多变量时间序列预测。 模型描…

论文阅读_条件控制_ControlNet

name_en: Adding Conditional Control to Text-to-Image Diffusion Models name_ch: 向文本到图像的扩散模型添加条件控制 paper_addr: http://arxiv.org/abs/2302.05543 date_read: 2023-08-17 date_publish: 2023-02-10 tags: [‘图形图像’,‘大模型’,‘多模态’] author: …

阿里云服务器-修改ecs操作系统,把window系统跟换成Linux操作系统

其他sql格式也在更新中&#xff0c;可直接查看这个系列&#xff0c;要是没有你需要的格式&#xff0c;可在评论或私信我 总目录 目录-后期更新打算 hive的nvl中的子查询 总目录我这个是window&#xff0c;默认应该都是window&#xff0c;我需要改成Linux系统第一步&#xff…

伦敦金走势图行情值得关注

不知道大家是否了解过伦敦金这个投资品种&#xff0c;或者有否财经网站以及金融终端上看到过它的行情走势图。其实&#xff0c;伦敦金并不是一种实实在在的黄金&#xff0c;而是一种跟踪伦敦现货黄金市场价格走势的黄金保证金交易品种&#xff0c;它每天的行情走势变化&#xf…

基于springboot自习室预约管理

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

基于樽海鞘群算法优化的BP神经网络(预测应用) - 附代码

基于樽海鞘群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于樽海鞘群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.樽海鞘群优化BP神经网络2.1 BP神经网络参数设置2.2 樽海鞘群算法应用 4.测试结果&#xff1a;5…

第十五课、Windows 下打包发布 Qt 应用程序

功能描述&#xff1a;讲解了 Windows 下打包发布 Qt 应用程序的三种方法&#xff0c;并对比优缺点 一、利用 windepolyqt 工具打包发布 Qt 提供了一个 windeployqt 工具来自动创建可部署的文件夹。 打包发布流程&#xff1a; 1. 新建一个文件夹&#xff0c;将编译后的可执行…

基于缎蓝园丁鸟算法优化的BP神经网络(预测应用) - 附代码

基于缎蓝园丁鸟算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于缎蓝园丁鸟算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.缎蓝园丁鸟优化BP神经网络2.1 BP神经网络参数设置2.2 缎蓝园丁鸟算法应用 4.测试结果&…

剪枝基础与实战(2): L1和L2正则化及BatchNormalization讲解

1. CIFAR10 数据集 CIFAR10 是深度学习入门最先接触到的数据集之一,主要用于图像分类任务中,该数据集总共有10个类别。 图片数量:6w 张图片宽高:32x32图片类别:10Trainset: 5w 张,5 个训练块Testset: 1w 张,1 个测试块Pytorch 集成了很多常见数据集的API, 可以通过py…

【Unity】2D平台游戏初中级教程-笔记补充

文章目录 观前提醒链接地址百度网盘&#xff08;第3、4、5章的Asset内容&#xff09; 为什么要弄这篇博客&#xff1f;章节内容提示本人制作的环境 第1章&#xff1a;玩家控制器Part1&#xff1a;设置瓦片地图与分类层的顺序【1】导入素材【2】制作瓦片地图【3】调色盘与瓦片存…

让智慧城市更进一步,无人机解决方案全面应用

在城市规划中&#xff0c;无人机正在颠覆传统的操作和思维方式。这种技术不仅改变了城市管理获取和分析信息的方式&#xff0c;还提供了前所未有的视角&#xff0c;使城市管理能够更加明智地制定策略。 1. 数据采集的新纪元&#xff1a; 城市规划的核心在于数据的收集和分析。…

Python“牵手”微店商品详情数据采集方法,微店API申请步骤说明

微店平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范。 微店API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问微店平台的数据&#xff0c;包括商品信息、店铺信息、物流信息&#xff0c;评论数据&#xff0c;店铺订…

云聊天项目测试

前言 以下将对云聊天项目编写测试用例以及主要功能的自动化测试。 1. 测试用例的编写 2. 自动化测试 以下进行部分自动化测试用例的执行&#xff0c;检验项目功能是否符合预期。 2.1 登录功能测试 测试代码&#xff1a; 输入非法用户名或密码逻辑相似&#xff0c;不重复描…

wustojc3001求三角形面积

#include <stdio.h> #include <math.h> int main() {float a,b,c,d;double s;scanf("%f%f%f",&a,&b,&c);if(ab>c&&ac>b&&cb>a){d(abc)/2;ssqrt(d*(d-a)*(d-b)*(d-c));//数学公式printf("%.2f",s);}retur…

听GPT 讲Alertmanager源代码--dispatch/silence/inhibit等

目前Alertmanager项目共计53M大小&#xff0c;其中.git占了46M&#xff0c;总的go代码行数不足6万行(包括.pb.go等文件)&#xff0c;不算是一个大项目。 但实现了告警的分发&#xff0c;静默等功能&#xff0c;值的研究&#xff0c;尤其是dispatch中的route部分。 在Prometheus…

使用 Terraform 与事件驱动的 Amazon CodeBuild 提升云上数据应用运维效率

背景信息 企业客户在云上部署的一系列数据应用的过程中&#xff0c;数据开发团队往往负责脚本内容&#xff0c;而其背后一系列云上资源的管理通常由一支云运维职能团队通过 IaC&#xff08;Infrastructre as Code&#xff09;实现。然而&#xff0c;当数据开发团队开发及部署相…