【代码随想录】【算法训练营】【第20天】 [654]最大二叉树 [617]合并二叉树 [700]二叉搜索树中的搜索 [98]验证二叉搜索树

前言

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

day 19,一个愉快的周日~
day 20,一个悲伤的周一~

题目详情

[654] 最大二叉树

题目描述

654 最大二叉树
654 最大二叉树

解题思路

前提:构造二叉树
思路:寻找根节点,左子树范围、右子树范围递归构造子树。
重点:注意数组的范围,左闭右开。

代码实现

C语言
虚拟头节点
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/int maxFun(int *nums, int numsSize, int *max)
{int maxVal = INT_MIN;int loc = 0;for (int i = 0; i < numsSize; i++){if (nums[i] > maxVal){maxVal = nums[i];loc = i;}}*max = maxVal;return loc;
}void addNode(struct TreeNode **root, int *nums, int numsSize)
{if (numsSize == 0){return ;}// 寻找最大值做根节点int maxVal = 0;int maxLoc = maxFun(nums, numsSize, &maxVal);// 保存该值为根节点*root = (struct TreeNode *)malloc(sizeof(struct TreeNode));(*root)->val = maxVal;(*root)->left = NULL;(*root)->right = NULL;// 构造左子树addNode(&((*root)->left), nums, maxLoc);// 构造右子树addNode(&((*root)->right), nums + maxLoc + 1, numsSize - maxLoc - 1);return ;
}struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {if (numsSize == 0){return NULL;}struct TreeNode *root = NULL;addNode(&root, nums, numsSize);return root;
}

[617] 合并二叉树

题目描述

617 合并二叉树
617 合并二叉树

解题思路

前提:合并二叉树
思路:二叉树位置重合时,结点值相加;位置仅有一个时,使用该结点,直接改变父节点的子节点的指针指向。
重点:注意结点不仅为非空的情况。

代码实现

C语言
先序遍历 递归
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/void traversal(struct TreeNode **root1, struct TreeNode *root2)
{// 结点判空if (*root1 == NULL){*root1 = root2;return ;}if (root2 == NULL){return ;}// 两节点均不为空(*root1)->val += root2->val;// 遍历左右子树traversal(&((*root1)->left), root2->left);traversal(&((*root1)->right), root2->right);return ;
}struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2) {traversal(&root1, root2);return root1;
}
层级遍历 队列
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2) {// 判空if (root1 == NULL){return root2;}if (root2 == NULL){return root1;}// 层级遍历 队列struct TreeNode *queue[2000];int idx = 0;queue[idx++] = root1;queue[idx++] = root2;int start = 0;while (start < idx){struct TreeNode *curNode1 = queue[start++];struct TreeNode *curNode2 = queue[start++];curNode1->val += curNode2->val;// 判断左子树情况if ((curNode1->left == NULL) && (curNode2->left != NULL)){curNode1->left = curNode2->left;}else if ((curNode1->left != NULL) && (curNode2->left != NULL)){queue[idx++] = curNode1->left;queue[idx++] = curNode2->left;}// 判断右子树情况if ((curNode1->right == NULL) && (curNode2->right != NULL)){curNode1->right = curNode2->right;}else if ((curNode1->right != NULL) && (curNode2->right != NULL)){queue[idx++] = curNode1->right;queue[idx++] = curNode2->right;}}return root1;
}

[700] 二叉搜索树中的搜索

题目描述

700 二叉搜索树中的搜索
700 二叉搜索树中的搜索

解题思路

前提:二叉搜索树的搜索
思路:二叉搜索树的结点是有序的,先序序列数组是递增的。
重点:二叉搜索树的特点。

代码实现

C语言
先序遍历 递归
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/struct TreeNode* searchBST(struct TreeNode* root, int val) {if (root == NULL){return NULL;}if (root->val == val){return root;}// 遍历左右子树struct TreeNode *ans = searchBST(root->left, val);if (ans == NULL){ans = searchBST(root->right, val);}return ans;
}
先序递归,平衡二叉树结点有序特性
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/struct TreeNode* searchBST(struct TreeNode* root, int val) {if ((root == NULL) || (root->val == val)){return root;}if (root->val > val){// 遍历左子树return searchBST(root->left, val);}else{// 遍历右子树return searchBST(root->right, val);}
}

[98] 验证二叉搜索树

题目描述

98 验证二叉搜索树
98 验证二叉搜索树

解题思路

前提:判断是否为二叉搜索树
思路:根据二叉搜索树的定义,可以递归判断该二叉树是否为二叉搜索树,可以中序遍历该树,看是否为递增数组。
重点:该树为二叉搜索树要求不仅仅是根节点值大于左子结点值、小于右子结点值,而是根节点大于左子树的最底层最右结点值、小于右子树的最底层最左结点值。

代码实现

C语言
中序遍历,遍历后判断递增
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/void traversal(struct TreeNode *root, int *nums, int *numsSize)
{if (root == NULL){return ;}// 中序遍历// 左traversal(root->left, nums, numsSize);// 中nums[(*numsSize)++] = root->val;// 右traversal(root->right, nums, numsSize);return ;
}bool isValidBST(struct TreeNode* root) {int nums[10000];int numsSize = 0;traversal(root, nums, &numsSize);for (int i = 1; i < numsSize; i++){if (nums[i] <= nums[i - 1]){return false;}}return true;
}
中序遍历,遍历时判断递增

保存当前遍历的节点的最大值,中序遍历中需要不断判断大于该值。
注意:不能使用全局变量,用例测试时不会重置全局变量。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
bool isValidBSTFun(struct TreeNode* root, long long *maxVal)
{// 判断空节点或者单节点if (root == NULL){return true;}// 左子树 小于bool ansLeft = isValidBSTFun(root->left, maxVal);// 中if (root->val <= *maxVal){return false;}else{*maxVal = root->val;}// 右子树 大于bool ansRight = isValidBSTFun(root->right, maxVal);return ((ansLeft) && (ansRight));
}bool isValidBST(struct TreeNode* root) {long long maxVal = LONG_MIN;return isValidBSTFun(root, &maxVal);
}

今日收获

  1. 二叉树构造;
  2. 二叉搜索树的特征。

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

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

相关文章

如何设置XHSC(华大)单片机的IO口中断

XHSC(华大)单片机IO口中断使用 一、代码说明 华大单片机的历程在华大或者小华的官网上都可以下载到,但是我们下载的历程基本注释都是非常简单,有的还没有注释;再加上小华跟华大的历程在代码架构上有所区别,所以新手在直接调用华大或者小华历程后,历程代码的可读性并不…

内网安全--域渗透准备知识

目录 知识点&#xff1a; 0x01 0x02 0x03 系列点&#xff1a; Linux主机信息收集 windows主机信息收集 知识点&#xff1a; 0、域产生原因 1、内网域的区别 2、如何判断在域内 3、域内常见信息收集 4、域内自动化工具收集 -局域网&工作组&域环境区别 -域…

# LLM高效微调详解-从Adpter、PrefixTuning到LoRA

一、背景 目前NLP主流范式是在大量通用数据上进行预训练语言模型训练&#xff0c;然后再针对特定下游任务进行微调&#xff0c;达到领域适应&#xff08;迁移学习&#xff09;的目的。 Context Learning v.s. SFT 指令微调是预训练语言模型微调的主流范式&#xff0c;其目的是…

通用代码生成器应用场景三,遗留项目反向工程

通用代码生成器应用场景三&#xff0c;遗留项目反向工程 如果您有一个遗留项目&#xff0c;要重新开发&#xff0c;或者源代码遗失&#xff0c;或者需要重新开发&#xff0c;但是希望复用原来的数据&#xff0c;并加快开发。 如果您的项目是通用代码生成器生成的&#xff0c;…

阿里云产品DTU评测报告(二)

阿里云产品DTU评测报告&#xff08;二&#xff09; 问题回顾问题处理继续执行 问题回顾 基于上一次DTU评测&#xff0c;在评测过程中遇到了windows系统情况下执行amp命令失败的情况&#xff0c;失败情况如图 导致后续命令无法执行&#xff0c;一时之间不知如何处理&#xff0…

python 两个表格字段列名称值,对比字段差异

支持xlsx,xls文件&#xff0c;相互对比字段列 输出两个表格文件相同字段&#xff0c;置底色为绿色 存在差异的不同字段&#xff0c;输出两个新的表格文件&#xff0c;差异字段&#xff0c;置底色为红色 注意点&#xff1a;读取的文件仅支持xlsx格式&#xff0c;头列需要删除…

【AD21】Gerber文件的输出

Gerber文件是对接生产的文件&#xff0c;该文件包含了PCB的所有层的信息&#xff0c;如铜层、焊盘、丝印层、阻焊层等。板厂使用这些文件来准备生产工艺。虽然可以将PCB发给板厂去打板&#xff0c;但是对于公司而言&#xff0c;直接发PCB会有泄密风险&#xff0c;Gerber文件会相…

《宝贵的人生建议》

致读者 2024/05/25 发表想法 简练表达&#xff0c;发散&#xff08;灵活&#xff09;运用。 原文&#xff1a;在写作过程中&#xff0c;我的主要精力是用在这个方面&#xff1a;把这些重要的经验教训浓缩为尽可能紧凑简炼、易于传播的语言。我鼓励读者在阅读时扩展这些“种子”…

不能错过的AI知识学习神器「Mo卡片」

1. 「Mo卡片」——知识点的另一种承载方式 1.1 产品特点 &#x1f4f1;一款专为渴望理解和掌握人工智能知识的小伙伴量身打造的轻量级 App。 &#x1f3f7;AI 知识卡片集 Mo卡片内置了 26 套卡片集&#xff0c;总计 1387 张卡片&#xff0c;每张卡片都能获得 1 个核心知识。…

GpuMall智算云:AUTOMATIC1111/stable-diffusion-webui/stable-diffusion-webui-v1.8.0

配置环境介绍 目前平台集成了 Stable Diffusion WebUI 的官方镜像&#xff0c;该镜像中整合如下资源&#xff1a; GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本&#xff1a;v1.8.0 Python版本&#xff1a;3.10.…

nginx与nginx-rtmp-module安装

nginx与nginx-rtmp-module安装 画了好几天图&#xff0c;实在有些乏力&#xff0c;找点有意思的事情做做 觉得视频流传输挺有意思&#xff0c;B站找了些视频&#xff0c;但感觉有些大同小异&#xff0c;讲得不是很清楚 FFmpeg/RTMP/webRTC丨90分钟搞定直播逻辑-推流-流媒体服…

半年不在csdn写博客,总结一下这半年的学习经历,coderfun的一些碎碎念.

前言 自从自己建站一来&#xff0c;就不在csdn写博客了&#xff0c;但是后来自己的网站因为资金问题不能继续维护下去&#xff0c;所以便放弃了自建博客网站来写博客&#xff0c;等到以后找到稳定&#xff0c;打算满意的工作再来做自己的博客网站。此篇博客用来记录自己在csdn…

Git Large File Storage (LFS) 的安装与使用

Git Large File Storage [LFS] 的安装与使用 1. An open source Git extension for versioning large files2. Installing on Linux using packagecloud3. Getting Started4. Error: Failed to call git rev-parse --git-dir: exit status 128References 1. An open source Git…

Android Studio 获取 SHA1

以 debug.keystore 调试密钥库为例。 步骤1&#xff1a;明确 debug.keystore 位置 debug.keystore 在 .android 目录下&#xff1a; Windows 用户&#xff1a;C:\Users\用户名\.android\debug.keystore Mac 用户&#xff1a;/Users/用户名/.android/debug.keystore 假设我的…

【云原生】用 Helm 来简化 K8s 应用管理

用 Helm 来简化 K8s 应用管理 1.诞生背景2.主要功能3.相关概念4.工作原理5.架构演变6.Helm 常用命令7.推荐仓库8.Charts8.1 目录结构8.2 构建一个无状态应用模版 charts Helm 对于 Kubernetes 来说就相当于 Yum 对于 Centos 来说&#xff0c;如果没有 Yum 的话&#xff0c;我们…

旅游推荐管理系统

代码位置:旅游管理系统: 根据若依模版的一个旅游管理系统 - Gitee.com 分支dev 项目介绍 项目目的 随着社会的高速发展&#xff0c;人们生活水平的不断提高&#xff0c;以及工作节奏的加快&#xff0c;旅游逐渐成为一个热门的话题&#xff0c;因为其形式的多样&#xff0c;涉…

linux经典定时任务

在使用时记得替换为自己的脚本路径。请在相应的脚本第一行加上#!/bin/bash&#xff0c;否则脚本在定时任务中无法执行。 1、在每天凌晨2点执行 0 2 * * * /bin/sh bashup.sh 2、每天执行两次 下面的示例命令将在每天上午5点和下午5点执行。您可以通过逗号分隔指定多个时间戳…

IO多路复用模型原理

在linux没有实现epoll事件驱动机制之前,常规的手段是选择select和poll等IO多路复用的方法来实现并发服务程序。但是在大数据、高并发、集群情况下,select和poll的性能瓶颈就出现了,于是epoll就诞生了 Select select函数监视的文件描述符分三类:writefds、readfds和exceptf…

日历管理软件:桌面日历保姆级安装

一、简介 1、日常管理是当代社会人常用的工具或者是说经常遗漏的工具&#xff0c;今天我推荐的这个软件&#xff0c;相信会让你一见衷心&#xff1a;桌面日历 通常用于记录时间、日期和重要事件。它可以是传统的纸质日历&#xff0c;也可以是电子版的桌面应用程序&#xff0c…