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

news2024/9/23 13:18:08

前言

思路及算法思维,指路 代码随想录。
题目来自 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. 二叉树的最近公共祖先。

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

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

相关文章

Vivado打开之前项目仿真过的波形文件

第一步&#xff1a;顶部菜单 点击&#xff1a;Open Static Simulation 然后在弹出的窗口找到.sim结尾的文件夹&#xff0c;在里面找到wdb结尾的文件&#xff0c;点击ok 第二步&#xff1a;依次点击下方红圈 找到wcfg结尾的文件&#xff0c;点击ok即可

Nat Genet|马丁院士团队利用单细胞和空间多组学描绘宫颈鳞癌免疫微环境图谱

宫颈鳞状细胞癌&#xff08;CSCC&#xff09;是宫颈癌最常见的组织学类型。虽然局部疾病预后良好&#xff0c;但晚期、转移性或复发性CSCC的5年生存率仅为16.5%&#xff0c;晚期宫颈癌中对免疫检查点阻断的反应有限。细胞异质性和可塑性是肿瘤进展和肿瘤免疫微环境(TIME)调节的…

React18 apexcharts数据可视化之甜甜圈图

03 甜甜圈图 apexcharts数据可视化之甜甜圈图。 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基本甜甜圈图个性图案的甜甜圈图渐变色的甜甜圈图 面包圈 import ApexChart from react-apexcharts;export function DonutUpdate() {// 数据…

Objective-C爬虫:实现动态网页内容的抓取

在当今的互联网时代&#xff0c;数据的获取和分析变得日益重要。无论是进行市场研究、用户行为分析还是产品开发&#xff0c;获取大量数据都是不可或缺的一环。然而&#xff0c;很多有价值的信息都隐藏在动态加载的网页中&#xff0c;这些网页通过JavaScript动态生成内容&#…

【组合数学 放球问题 虚拟点 小于等于转小于】1621. 大小为 K 的不重叠线段的数目

本文涉及知识点 放球问题 组合数学汇总 本题难道分&#xff1a;2198 LeetCode1621. 大小为 K 的不重叠线段的数目 给你一维空间的 n 个点&#xff0c;其中第 i 个点&#xff08;编号从 0 到 n-1&#xff09;位于 x i 处&#xff0c;请你找到 恰好 k 个不重叠 线段且每个线段…

CATIA入门操作案例——波纹管的绘制,自定义参数和公式,定义法则曲线,通过平行曲线绘制正弦曲线

目录 引出波纹管的绘制解决&#xff1a;不显示参数关系 方法一&#xff1a;法则曲线的使用自定义参数和公式 方法二&#xff1a;自己画法则曲线定义法则曲线 方式三&#xff1a;平行曲线画正弦曲线 总结异形弹簧新建几何体草图编辑&#xff0c;画一条样条线进行扫掠&#xff0c…

解决java.nio.file.AccessDeniedException: Permission denied

解决java.nio.file.AccessDeniedException: Permission denied 摘要引言正文1. 理解异常的根本原因2. 检查文件权限3. 处理文件被锁定4. 提升权限或更改文件所有者5. 异常处理 总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f…

嵌入式UI开发-lvgl+wsl2+vscode系列:4、动画(Animations)

文章目录 一、前言二、动画示例1、示例1&#xff08;基础按钮label的组合动画&#xff09;2、示例2&#xff08;回放效果动画&#xff09;3、示例3&#xff08;贝塞尔曲线3动画&#xff09;4、示例4&#xff08;动画时间轴&#xff09; 三、最后 一、前言 接下来我们进行动画的…

柯桥成人职场英语/Excuse me 是 “不好意思”,那 Excuse you呢?

口语中&#xff0c;excuse me的使用频率非常高 甚至已经成为大家的口头禅 用在一些表示歉意或者打扰对方的场合 本来excuse me的用法就已经够丰富了 没想到竟然还有excuse you&#xff1f; 哈哈哈&#xff0c;别蒙圈 这篇就给大家捋捋excuse的那些表达 快和小编一起来学学…

TinyEngine 低代码引擎:带你5分钟高效构建游戏登录界面

本文由体验技术团队 TinyEngine 项目成员李旭宏创作&#xff0c;欢迎大家实操体验&#xff0c;本体验项目基于 TinyEngine 低代码引擎提供的环境&#xff0c;通过体验简单拖、拉、拽的形式帮助开发者快速了解低代码引擎的使用流程&#xff0c;达到快速开发游戏登录界面的效果。…

Java Object类方法介绍

Object作为顶级类&#xff0c;所有的类都实现了该类的方法&#xff0c;包括数组。 查询Java文档&#xff1a; 1、object.eauqls(): 其作用与 有些类似。 &#xff1a; 是一个比较运算符&#xff0c;而不是一个方法。 ①可以判断基本类型&#xff0c;也可以判断引用类型。 ②若…

【C++】构造函数、析构函数、拷贝构造与运算符重载

文章目录 1.类的六个默认构造函数2.构造函数2.1特性2.1.1 函数名与类名相同2.1.2. 无返回值&#xff08;不能写void&#xff09;2.1.3. 对象实例化时编译器自动调用对应的构造函数2.1.4 构造函数可以重载2.1.5编译器生成默认的构造函数2.1.6编译器生成的默认构造有何用&#xf…

webserver服务器从零搭建到上线(九)|EpollPoller事件分发器类(一)——详解成员变量、简述成员方法

在本节中&#xff0c;我们一起来仔细探讨一下EpollPoller类。该类可以说是muduo库中最最核心的类了&#xff0c;一定要搞懂&#xff01; 文章目录 私有成员using ChannelList std::vector<Channel*>looping_、quit_threadId_pollReturnTime_、poller_wakeup_fd、wakeupC…

AI赋能:人工智能技术驱动下的品牌海外市场精准分析与营销策略

随着全球化的加速和科技的飞速发展&#xff0c;品牌在海外市场的竞争愈发激烈。为了在竞争激烈的国际市场中脱颖而出&#xff0c;品牌需要更深入地了解海外消费者的行为、趋势和偏好。在这个过程中&#xff0c;人工智能&#xff08;AI&#xff09;技术以其强大的数据处理和分析…

3、python安装-linux系统下

安装前置依赖软件&#xff0c;安装完成后&#xff0c;打开官网&#xff0c;下载linux系统下的python安装包&#xff1a; 选择最新的版本 点击最新版本&#xff0c;进入版本对应的界面&#xff0c; 选择第一个进行源码的编译&#xff0c;右键选择复制连接地址&#xff0c; 回到终…

大数据面试题 —— Hive

目录 Hive 是什么为什么要使用 HiveHive 的优缺点Hive的实现逻辑&#xff0c;为什么处理小表延迟比较高你可以说一下 HQL 转换为 MR 的任务流程吗 ***你可以说一下 hive 的元数据保存在哪里吗 ***Hive与传统数据库之间的区别Hive内部表和外部表的区别 ***hive 动态分区与静态分…

Generate Anything Anywhere in Any Scene #论文阅读

URL https://arxiv.org/pdf/2306.17154 TD;DR 2023 年 6 月 Wisconsin 的文章。围绕 ip 保持做的扩展任务&#xff0c;核心目标是对指定 ip 可以生成任意大小的&#xff08;指定 ip&#xff09;、任意背景的图片&#xff0c;同时可以通过 bbox 控制物体位置和多物体生成。主…

当客户说价格比市场还要高,就这么回怼!

外贸客户说:价格高出市场价30%。我们给客户卖产品&#xff0c;难免会有讨价还价这回事&#xff0c;讨价还价也是一门技术活&#xff0c;得摸透客户心理还要在嘴皮子上占优势&#xff0c;局面还得拿到主动权… 所以今天给大家分享一些讨价还价的思路和要点&#xff0c;希望大家用…

若依新增页面,在左侧显示菜单栏的页面,可点击

选择指定的某个目录下 菜单名称&#xff0c;路由地址&#xff0c;组件路径这几个是必填的&#xff0c;其他的暂时就不用管了。 菜单名称&#xff1a;就是显示到左侧目录中的名称。 路由地址&#xff1a;自定义&#xff0c;一般写页面名称就可以。 组件路径&#xff1a;根据前端…

神奇的一万

在代码界&#xff0c;有个神奇的存在&#xff0c;它叫一万&#xff1a;eval&#xff08;&#xff09;。 这个神奇的一万&#xff0c;在python和JavaScript中都存在&#xff0c;作用也是基本相同的。 Python中的eval函数能将字符串str当成有效的表达式来求值并返回计算结果。 …