题目描述

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

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

示例 1:
输入:
2

/ \
2 5

 / \
5   7

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

解题思路

题目解析:刚开始解这题没看懂题目意思,根据题目的约束,根节点必然是最小的节点,所以第二小节点就变成了求剩下子节点的最小值
这题想通了就简单

一、 使用递归,
1、如果当前节点和父节点的值不等,那么当前节点就是第二小的节点,剩下的节点就不用管了,直接返回节点值
2、如果当前节点和父节点的值相同,则将当前节点作为根节点进行递推,先判空,然后获取左右两节点的返回值,再根据返回值,看返回上一层的值 a:左/右节点没找到,则返回右/左节点的值,b:如果左右都有返回值,则取小值。

二、使用迭代

1、根据题意,先对根几点进行判断,
2、然后找到剩下所有节点的值中,不等于根节点值的节点的最小值
3、将找到的最小值,综合根节点的左右节点值执行判断
    a、最小值和根节点值不相同,则找到了第二小值,直接返回;
    b、最小值和根节点值相同,再判断,如果最小值和左右节点的大值都相等---->最小值就是根值--->未找到第二小的值,返回-1;
    c、最小值和根节点值相同,如果最小值小于左右节点的大值--->根节点左右值中的大值即使第二小的值--->返回大值

语言积累和技巧

q.offer
q.poll

对题意的理解和对约束条件的使用很重要

vscode 代码链接

https://github.com/lunaDolphi...
https://github.com/lunaDolphi...


blueDolphin
12 声望1 粉丝