LeetCode 671. 二叉树中第二小的节点
发布日期:2021-07-01 03:14:05 浏览次数:2 分类:技术文章

本文共 1637 字,大约阅读时间需要 5 分钟。

文章目录

1. 题目信息

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

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

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

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/second-minimum-node-in-a-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 根节点是最小的,依次查找每个节点是否比最小的大
  • 并更新找到的第二小的数组

2.1 递归查找

在这里插入图片描述

class Solution {
public: int findSecondMinimumValue(TreeNode* root) {
if(!root) return -1; int minNum = root->val; long secMinNum = LONG_MAX; findSec(root,minNum,secMinNum); if(secMinNum != LONG_MAX) return secMinNum; return -1; } void findSec(TreeNode* root, int &minNum, long &secMinNum) {
if(!root) return; if(root->val > minNum && root->val < secMinNum) {
secMinNum = root->val; } findSec(root->left,minNum,secMinNum); findSec(root->right,minNum,secMinNum); }};

2.2 改循环

前序循环

在这里插入图片描述

class Solution {
public: int findSecondMinimumValue(TreeNode* root) {
if(!root) return -1; int minNum = root->val; long secMinNum = LONG_MAX; stack
stk; while(root || !stk.empty()) {
while(root) {
stk.push(root); if(root->val > minNum && root->val < secMinNum) secMinNum = root->val; root = root->left; } root = stk.top()->right; stk.pop(); } if(secMinNum != LONG_MAX) return secMinNum; return -1; }};

转载地址:https://michael.blog.csdn.net/article/details/100550016 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode 113. 路径总和 II(回溯)
下一篇:LeetCode 173. 二叉搜索树迭代器(中序遍历)

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月23日 18时53分32秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章