【代码随想录】【算法训练营】【第21天】 [530]二叉搜索树的最小绝对差 [501]二叉搜索树的众数 [236]二叉树的最近公共祖先

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 21,天气不错的周二~

题目详情

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

题目描述

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

解题思路

前提:二叉搜索树
思路:根据二叉搜索树的中序序列有序性,可以计算相邻结点的差值,最小即为所求。
重点:二叉搜索树特性。

代码实现

C语言
中序遍历 递归
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

void traversal(struct TreeNode *root, int *minVal, int *preVal)
{
    // 判空
    if (root == NULL)
    {
        return ;
    }
    // 中序遍历
    // 左子树
    traversal(root->left, minVal, preVal);
    // 判断是否为最小值
    if (*preVal == -1)
    {
        // 第一个结点
        *preVal = root->val;
    }
    else
    {
        if ((root->val - *preVal) < *minVal)
        {
            *minVal = root->val - *preVal;
        }
        *preVal = root->val;
    }
    // 右子树
    traversal(root->right, minVal, preVal);
    return ;
}

int getMinimumDifference(struct TreeNode* root) {
    int minVal = INT_MAX;
    int preVal = -1;
    traversal(root, &minVal, &preVal);
    return minVal;
}
中序遍历 迭代栈
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int getMinimumDifference(struct TreeNode* root) {
    int minVal = INT_MAX;
    struct TreeNode *pre = NULL;
    struct TreeNode *cur = root;
    // 中序遍历 迭代栈
    struct TreeNode *stack[10000];
    int idx = 0;
    while ((cur != NULL) || (idx != 0))
    {
        // 左节点
        if (cur != NULL)
        {
            stack[idx++] = cur;
            cur = cur->left;
        }
        else
        {
            // 中
            cur = stack[--idx];
            if (pre != NULL)
            {
                minVal = (minVal > (cur->val - pre->val)) ? (cur->val - pre->val) : minVal;
            }
            pre = cur;
            // 右
            cur = cur->right;
        }
    }
    return minVal;
}

[501] 二叉搜索树的众数

题目描述

501 二叉搜索树的众数
501 二叉搜索树的众数

解题思路

前提:二叉搜索树 含重复数值
思路:二叉搜索树中序序列非递减序列,判断数值出现频率最高的元素
重点:二叉搜索树中序序列非递减序列。

代码实现

C语言
中序遍历 递归
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

void traversal(struct TreeNode *root, int *nums, int *returnSize, int *maxSize, int *curNum, int *curSize)
{
    // 判空
    if (root == NULL)
    {
        return ;
    }
    // 中序遍历
    // 左子树
    traversal(root->left, nums, returnSize, maxSize, curNum, curSize);
    // 中
    if (root->val == *curNum)
    {
    	// 当前遍历数值未发生变化,数量+1
        (*curSize)++;
    }
    else
    {
    	// 当前遍历数值发生变化,重新计数
        *curSize = 1;
    }
    // 判断当前数值数量
    if (*curSize >= *maxSize)
    {
    	// 当前数值出现频率 > 当前最高频率
        if (*curSize > *maxSize)
        {
        	// 保存当前频率为最高频率,数量重新计数
            *maxSize = *curSize;
            *returnSize = 1;
        }
        else
        {
        	// 当前数值出现频率 == 当前最高频率, 返回数量+1
            (*returnSize)++;
        }
        // 赋值返回数组元素
        nums[(*returnSize) - 1] = root->val;
    }
    // 保存当前数值,便于下一个节点判断
    *curNum = root->val;
    // 右子树
    traversal(root->right, nums, returnSize, maxSize, curNum, curSize);
    return ;
}

int* findMode(struct TreeNode* root, int* returnSize) {
    *returnSize = 0;
    int *nums = (int *)malloc(sizeof(int) * 10000);
    int maxSize = 0;
    int curNum = INT_MIN;
    int curSize = 0;
    traversal(root, nums, returnSize, &maxSize, &curNum, &curSize);
    return nums;
}

[236] 二叉树的最近公共祖先

题目描述

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

解题思路

前提:p、q均存在于二叉树上
思路:后序遍历,判断是否同处于某结点的左右子树上。
重点:有可能p、q为左右子树上,也有可能p为q的祖先。

代码实现

C语言
后序遍历 返回最近公共祖先
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

struct TreeNode *traversal(struct TreeNode *root, struct TreeNode* p, struct TreeNode* q)
{
    // 判空
    if ((root == NULL) || (p == NULL) || (q == NULL))
    {
        return NULL;
    }
    // 判断是否为该结点
    if ((root == p) || (root == q))
    {
        return root;
    }
    // 左子树判断
    struct TreeNode *leftNode = traversal(root->left, p, q);
    // 右子树判断
    struct TreeNode *rightNode = traversal(root->right, p, q);
    // 判断是否遍历到了
    if ((leftNode != NULL) && (rightNode != NULL))
    {
    	// p、q位于root的左右两子树上,将root返回
        return root;
    }
    if ((leftNode != NULL) && (rightNode == NULL))
    {
        // p、q至少其一位于root的左子树上,将leftNode返回,交由上层判断另一结点位置,有可能两节点均在该左子树上
        return leftNode;
    }
    if ((rightNode != NULL) && (leftNode == NULL))
    {
    	// p、q至少其一位于root的右子树上,将rightNode返回,交由上层判断另一结点位置,有可能两节点均在该右子树上
        return rightNode;
    }
    // p、q均不位于root的左右两子树上
    return NULL;
}

struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
    struct TreeNode *ans = traversal(root, p, q);
    return ans;
}

今日收获

  1. 二叉搜索树的中序遍历的使用
  2. 二叉树的最近公共祖先。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

李廉洋:5.29黄金早盘2365-2345区间,今日行情走势分析及策略。

黄金消息面分析&#xff1a;当前美国存在一个令人担忧且未被充分关注的问题&#xff1a;房地产行业低迷、高利率和抵押贷款利率、租金高涨以及美联储的紧缩政策构成了一个恶性循环。由于高房价和高抵押贷款利率&#xff0c;美国住房经济活动远低于两年前的水平。为了让该行业好…

Post Microsoft Build and AI Day 上海开发者日

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 这个六一怎么过&#xff1f;来微软 Reactor&#xff0c;一起过儿童节吧&#xff01; 6月1日&#xff0c;Microsoft Azure & Microsoft Reactor 面向大小朋友特别推出六一特辑&#xff0c;「Post Mic…

【原创】java+springboot+mysql日程管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Mac | Mac 移动硬盘无法分区问题

现象问题 电脑配置&#xff1a;MacBook Pro M1&#xff0c;系统 Sonoma Mac 系统新升级了 Sonoma&#xff0c;结果出现各种问题。外接屏幕居然不能旋转 90 &#xff0c;查了一下是Sonoma系统导致的&#xff0c;以及莫名发热的问题。想着要么回退一下系统算了&#xff0c;于是网…

基于tensorflow的咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、前期工作 1. 设置GPU import tensorflow as tfgpus tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_gr…

Redhat9 LAMP安全配置方案及测试

目录 数据库主机 安装Mariadb数据库服务 设置mariadb开机自动启动 Php主机 部署Apache服务器 设置apache服务开机自启 安装php 安装 phpMyAdmin 打开测试机 更新软件包列表&#xff1a; 首先&#xff0c;确保你的软件包列表是最新的。打开终端并输入以下命令&#xf…

电脑如何远程访问?

【天联】的使用场景 电脑远程访问在现代科技的发展中扮演了重要的角色。对于企业和个人用户来说&#xff0c;远程访问的便利性提供了许多机会和可能性。作为一种高效的工具&#xff0c;【天联】具有广泛的应用场景&#xff0c;可以实现异地统一管理、协同办公以及远程数据采集…

咖啡看书休闲时光404错误页面源码

源码介绍 咖啡看书休闲时光404错误页面源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 源码效果 源码下载 咖啡看书…

WEB安全:Content Security Policy (CSP) 详解

Content Security Policy (CSP) 是一种强大的网页安全机制,用于防止跨站脚本 (XSS) 和其他注入攻击。通过设置一系列的内容安全策略,CSP 可以限制网页可以加载的资源,从而保护用户数据和网站的安全性。 什么是 XSS 攻击? 跨站脚本攻击 (XSS) 是一种常见的安全漏洞,攻击者…

2024年JAVA、C++、Pyhton学哪种语言更容易进国央企?

对于不同编程语言在进入国有企业的观点大体是正确的&#xff0c;不过在实际选择时还需考虑一些因素。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信…

“2024南京智博会”共同探索智能科技产业创新发展新路径

随着全球数字化浪潮的深入推进&#xff0c;智慧城市、物联网与大数据等领域的发展成为推动经济社会发展的重要力量。在这样的背景下&#xff0c;2024南京国际智慧城市、物联网、大数据博览会&#xff08;南京智博会&#xff09;的举办&#xff0c;无疑为国内外企业提供了一个绝…

如何成为一名合格的JAVA程序员?

如何成为一名称职的Java编程人员&#xff1f;你一定不能错过的两本书。 第一本《Java核心技术速学版&#xff08;第3版&#xff09;》&#xff01; 1.经典Java作品《Java核心技术》的速学版本&#xff0c;降低学习门槛&#xff0c;帮助读者更容易学习Java&#xff0c;更快地把…

基于ssm的微信小程序的居民健康监测系统

采用技术 基于ssm的微信小程序的居民健康监测系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 后端页面 用户信息管理 健康科普管理 公告管理 论坛…

C++线程任务队列模型

功能描述 实现一个任务队列&#xff0c;用于任务的执行 任务队列 任务队列可以添加、删除任务&#xff0c;实现对任务的管理添加任务后&#xff0c;任务队列可以开始执行任务队列执行任务方式为串行执行 任务 任务执行需要持续一段10s内随机的时间&#xff0c;执行过程通过…

每天五分钟深度学习:如何使用计算图来反向计算参数的导数?

本文重点 在上一个课程中&#xff0c;我们使用一个例子来计算函数J&#xff0c;也就相当于前向传播的过程&#xff0c;本节课程我们将学习如何使用计算图计算函数J的导数。相当于反向传播的过程。 计算J对v的导数&#xff0c;dJ/dv3 计算J对a的导数&#xff0c;dJ/da&#xf…

JVM学习-字节码指令集(一)

概述 Java字节码对于虚拟机&#xff0c;好像汇编语言对于计算机&#xff0c;属于基本执行指令Java虚拟机的指令由一个字节长度的&#xff0c;代表某种特定操作含义 的数字(称为操作码Opcode)以及跟随其后的零至多个代表此操作所需参数(操作数&#xff0c;Operands)而构成&…

如何实时掌握手机号状态的API利器分析

在移动互联网的时代&#xff0c;手机号码不仅是通信的连接点&#xff0c;也是用户身份的关键识别。手机状态查询API 通过提供实时的手机号码状态查询服务&#xff0c;协助企业和组织更有效地管理用户信息&#xff0c;提升服务流程。 手机状态查询API 通过与电信运营商的数据库进…

UE5 使用外置摄像头进行拍照并保存到本地

连接外置摄像头功能&#xff1a;https://docs.unrealengine.com/4.27/zh-CN/WorkingWithMedia/IntegratingMedia/MediaFramework/HowTo/UsingWebCams/ 核心功能&#xff1a;UE4 相机拍照功能&#xff08;图片保存&#xff09;_ue 移动端保存图片-CSDN博客 思路是&#xff1a; …

《python编程从入门到实践》day41

# 昨日知识点回顾 用户注销、注册&#xff0c;限制访问&#xff0c;新主题关联到当前用户 # 今日知识点学习 第20章 设置应用程序的样式并部署 20.1 设置项目“学习笔记”的样式 20.1.1 应用程序django-bootstrap4 # settings.py ---snip--- INSTALLED_APPS [# 我的应用程序…

免费,Python蓝桥杯等级考试真题--第14级(含答案解析和代码)

Python蓝桥杯等级考试真题–第14级 一、 选择题 答案&#xff1a;B 解析&#xff1a;键为‘B’对应的值为602&#xff0c;故答案为B。 答案&#xff1a;A 解析&#xff1a;字典的符合为花括号&#xff0c;先键后值&#xff0c;故答案为A。 答案&#xff1a;C 解析&#xff1a…