671. Second Minimum Node In a Binary Tree

2023-12-21 16:38
文章标签 node tree binary minimum second 671

本文主要是介绍671. Second Minimum Node In a Binary Tree,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

671. 二叉树中第二小的节点

给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。 

给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1

示例 1:

输入: 2/ \2   5/ \5   7输出: 5
说明: 最小的值是 2 ,第二小的值是 5 。

示例 2:

输入: 2/ \2   2输出: -1
说明: 最小的值是 2, 但是不存在第二小的值。

解法一

//时间复杂度O(nlogn), 空间复杂度O(logn)
/*** 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:int pcldown(TreeNode*& root) {if(!root) return -1;int ret = root->val;if(!root->left && !root->right) {root = nullptr;return ret;}else if(!root->left && root->right) {root->val = root->right->val;pcldown(root->right);}else if(root->left && !root->right) {root->val = root->left->val;pcldown(root->left);}else {int vl = root->left->val;int vr = root->right->val;if(vl < vr) {root->val = vl;pcldown(root->left);}else {root->val = vr;pcldown(root->right);}}return ret;}int findSecondMinimumValue(TreeNode* root) {int last = pcldown(root), rec;while((rec = pcldown(root)) == last);return rec;}
};

解法二

//时间复杂度O(n), 空间复杂度O(logn)
/*** 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:int find(TreeNode* root, int last) {if(!root) return -1;if(root->val > last) return root->val;int vl = find(root->left, last);int vr = find(root->right, last);return vl == -1 || vr == -1 ? max(vl, vr) : min(vl, vr);}int findSecondMinimumValue(TreeNode* root) {int last = root->val;return find(root, last);}
};

解法一

这个特殊的树有如下性质:

对于该树的每一个结点,它的结点值不大于其子结点(如果有的话)值。

有一种数据结构叫,函数pcldown与堆的DeleteMin操作类似:每次调用pcldown,就将树的根结点值挖走,用其较小的子结点作填充;然后递归地对其用来填充的子结点作相同的下滤操作,直到遇到子结点为空。

主函数反复地对树进行pcldown操作,直到挖出的值不等于第一个值last,返回即可。

解法二

上面的解法华而不实。解法二是常规的先序遍历,如果遇到了比last大的元素就直接返回;否则就在左、右子树中寻找,比较后返回。

2019/06/17 23:08

这篇关于671. Second Minimum Node In a Binary Tree的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/520727

相关文章

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件