【代码随想录】【算法训练营】【第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. 二叉树的最近公共祖先。

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

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

相关文章

长安链使用Golang编写智能合约教程(二)

本篇说的是长安链2.3.的版本的智能合约&#xff0c;虽然不知道两者有什么区别&#xff0c;但是编译器区分。 教程三会写一些&#xff0c;其他比较常用SDK方法的解释和使用方法 编写前的注意事项&#xff1a; 1、运行一条带有Doker_GoVM的链 2、建议直接用官方的在线IDE去写合…

奥枫软件Java要个16K遇到地狱级难度,醉了。。。

我只能说地狱难度&#xff0c;没绝对把握就别去了。我凭借前辈的经验&#xff0c;和当时天时地利人和&#xff0c;六道题答得很不错&#xff0c;但还是没通过。我有备而来都没过&#xff0c;现场写那些应该都是白忙活了。 一面 1&#xff0c;分割一个整数。如123&#xff0c;结…

抖音本地生活服务商入驻指南分享!

当前&#xff0c;各大平台的团购外卖业务持续火爆&#xff0c;并逐渐成为众多创业赛道中的大热门。其中&#xff0c;本地生活服务更是在短时间内杀出重围&#xff0c;成为创业者们的首选。 根据抖音生活服务近日发布的《2023年度数据报告》&#xff0c;2023年&#xff0c;抖音生…

2024年湖北水平能力测试能搞定吗?

武汉中级职称报名正式高一段落&#xff0c;意味着今年武汉市中级职称报名除开东湖高新区之外&#xff0c;其余地方都已经正式截止了&#xff0c;那么接下来大家都在准备6月中下旬的水平能力测试考试。 水平能力测试分为两种&#xff1a;面试答辩或者笔试机考试卷&#xff0c;面…

vue脚手架与创建vue项目

一、前言 vue脚手架的安装与创建vue项目需要先行安装配置node与npm&#xff0c;详情可以看node、npm的下载、安装、配置_node 下载安装-CSDN博客 二、vue脚手架的使用 1、vue与vue脚手架的版本 Vue脚手架&#xff08;Vue CLI&#xff09;是Vue.js官方提供的一个命令行工具&…

【基础篇-Day8:JAVA字符串的学习】

目录 1、常用API2、String类2.1 String类的特点2.2 String类的常见构造方法2.3 String类的常见面试题&#xff1a;2.3.1 面试题一&#xff1a;2.3.2 面试题二&#xff1a;2.3.3 面试题三&#xff1a;2.3.4 面试题四&#xff1a; 2.4 String类字符串用于比较的方法2.5 String类字…

埃隆·马斯克的 xAI 募集 60 亿美元,瞄准 AI 超级计算机|TodayAI

埃隆马斯克&#xff08;Elon Musk&#xff09;创立的人工智能公司 xAI 宣布成功募集了 60 亿美元的资金&#xff0c;用于推动其“首批产品推向市场&#xff0c;建立先进的基础设施&#xff0c;并加速未来技术的研发”。马斯克透露&#xff0c;xAI 目前的估值已达到 180 亿美元&…

如何简化不同网间文件摆渡的操作流程,降低IT人员工作量?

为了保护内部核心数据不被泄露&#xff0c;同时有效屏蔽外部网络攻击的风险&#xff0c;企业大多会选择实施网络隔离。将“自己人”与“外人”隔离&#xff0c;具有较强的安全敏感性。有些企业还会在内部网络中进一步划分&#xff0c;比如划分为研发网、办公网、生产网等&#…

PaliGemma – 谷歌的最新开源视觉语言模型(一)

引言 PaliGemma 是谷歌推出的一款全新视觉语言模型。该模型能够处理图像和文本输入并生成文本输出。谷歌团队发布了三种类型的模型&#xff1a;预训练&#xff08;PT&#xff09;模型、混合&#xff08;Mix&#xff09;模型和微调&#xff08;FT&#xff09;模型&#xff0c;每…

【Django】从零开始学Django【2】

五. CBV视图 Django植入了视图类这一功能&#xff0c;该功能封装了视图开发常用的代码&#xff0c;无须编写大量代码即可快速完成数据视图的开发&#xff0c;这种以类的形式实现响应与请求处理称为CBV(Class Base Views)。 1. 数据显示视图 数据显示视图是将后台的数据展示…

LED屏控制卡是如何控制LED屏的?

LED屏控制卡是LED显示屏的关键组件之一&#xff0c;负责将输入的画面信息转换为LED屏能够显示的数据和控制信号。以下是LED屏控制卡的工作原理和功能的详细介绍&#xff1a; 1. LED显示屏控制器概述&#xff1a; LED显示屏控制器是LED显示屏的核心部件之一&#xff0c;也称为LE…

记一次Chanakya靶机的渗透测试

Chanakya靶机渗透测试 首先通过主机发现发现到靶机的IP地址为:172.16.10.141 然后使用nmap工具对其进行扫描:nmap -sC -sV -sS -p- 172.16.10.141 发现目标靶机开启了80,22,21等多个端口&#xff0c; 访问80端口,发现是一个普通的页面,点击进入多个界面也没有其他有用的信息,然…

Openai革新AI陪伴赛道?国内的AI陪伴创业公司有哪些?

人是一切社会关系的总和&#xff0c;而人的这种社会关系又依靠着情感来联系的。但是自从陪伴式AI的出现仿佛就打破了这种传统的关系。 在你的身边有这样一个“人”&#xff0c;她善解人意、风趣幽默&#xff0c;不会发脾气还会随时陪伴着你&#xff0c;这一在科幻电影中才会出现…

Linux-----sed案例练习

1.数据准备 准备数据如下&#xff1a; [rootopenEuler ~]# cat openlab.txt My name is jock. I teach linux. I like play computer game. My qq is 24523452 My website is http://www.xianoupeng.com My website is http://www.xianoupeng.com My website is http://www.…

振弦采集仪在岩土工程地质灾害监测中的可行性研究

振弦采集仪在岩土工程地质灾害监测中的可行性研究 引言&#xff1a; 岩土工程地质灾害是指在岩土体中由于自然力和人类活动等因素引起的&#xff0c;对人类生活、财产以及环境造成威胁的灾害。为了及时发现并准确监测地质灾害的发生和演化过程&#xff0c;振弦采集仪作为一种新…

计网期末复习指南:物理层(物理层的任务、香农公式、常用信道复用技术)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算机…

零基础想学编程,选择哪一门语言更好?(非常详细)零基础入门到精通就业,收藏这一篇就够了!

&#x1f446;点击关注 获取更多编程干货&#x1f446; 编程语言的用途广泛&#xff0c;它们各自在不同的领域和应用场景中发挥着重要作用。 零基础初学者在选择编程语言时&#xff0c;可以从就业方向入手选择。 Python 就业方向&#xff1a;数据科学、机器学习、人工智能…

基于 IP 的 DDOS 攻击实验

介绍 基于IP的分布式拒绝服务&#xff08;Distributed Denial of Service, DDoS&#xff09;攻击是一种利用大量受控设备&#xff08;通常是僵尸网络&#xff09;向目标系统发送大量请求或数据包&#xff0c;以耗尽目标系统的资源&#xff0c;导致其无法正常提供服务的攻击方式…

3-Django项目继续--初识ModelForm

目录 ModelForm 认识ModelForm 优势 初识Form 初识ModelForm 添加信息 views.py add_student_new.html 修改信息 views.py views.py add_student_new.html ModelForm 认识ModelForm 优势 1、方便校验用户提交的数据 2、页面展示错误提示 3、数据库字段很多的情况…

期望薪资25K,新浪微博测试4轮面试,没想到过了。。

一面60min 1、离职原因 2、简单的算法题&#xff0c;就是我会什么让写什么&#xff1a; 冒泡排序&#xff0c;二分查找&#xff08;其实这么简单&#xff0c;我还是在指引下写出来的&#xff0c;自己实在太菜&#xff09; 3、简历问答&#xff08;随机抽几个点问&#xff0…