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

相关文章

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、路由模块添加前缀 四、中间件

Node Linux相关安装

下载经编译好的文件cd /optwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gztar -xvf node-v10.15.3-linux-x64.tar.gzln -s /opt/node-v10.15.3-linux-x64/bin/npm /usr/local/bin/ln -s /opt/nod

树(Tree)——《啊哈!算法》

树 什么是树?树是一种特殊的图,不包含回路的连通无向树。 正因为树有着“不包含回路”这个特点,所以树就被赋予了很多特性。 一棵树中的任意两个结点有且仅有唯一的一条路径连通。一棵树如果有n个结点,那么它一定恰好有n-1条边。在一棵树中加一条边将会构成一个回路。 一棵树有且只有一个根结点。 没有父结点的结点称为根结点(祖先)。没有子结点的结点称为叶结点。如果一个结点既不是根结点也不是叶

在Debian 8上安装Node.js的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Node.js 是一个通用编程的 JavaScript 平台,允许用户快速构建网络应用程序。通过在前端和后端都使用 JavaScript,开发可以更加一致,并且可以在同一个系统中设计。 在本指南中,您将在 Debian 8 服务器上安装 Node.js。Debian 8 包含一个版本的

使用Node-API进行异步任务开发

一、Node-API异步任务机制概述         Node-API异步任务开发主要用于执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应效率。         1、应用场景: 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作项来避免阻塞主线程。网络请求:当需要进行网络请求并等待响应时,可以使用异步工作项来避免阻塞主线程,从而提高应用程序的响应性能。数据库操

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro