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

博客围绕求二叉树中第二小的节点展开,聚焦于二叉树相关信息技术问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                                                                                                                          点击此处返回总目录

 

 

【题目】

 

 

【分析】

根节点的值肯定是最小的。每个节点的值<=子节点的值。越往下越大。

 

只要找到左边第一个比根大的节点和右边第一个比根大的节点,然后看看谁小就行了。

 

怎么找到左边第一个比根大的节点呢?

如果左孩子比根大,那么左孩子就是第一个比根大的节点,而且不需要往下再找。

如果左孩子等于根的值,那么就递归地往下找。

 

即:

if(root.left.val == root.val){

      递归(root.left);

}else{

      return root.left.val;

}

 

 

【代码】

 

 

【结果】

 

 

都1ms了,才78%,你还要怎么样!

 

【改进】

上面的代码已经很快了。但是有一个小的地方限制了一下速度,就是比较左右两边的值大小的时候。如果没有找到返回-1,如果找到了则返回一个正数。这样得分四种情况:一个找到了,一个没找到;都没找到;都找到了。

如果没找到也能返回一个很大的整数,那么就可以统一用Math.min()返回了。

 

但是,最大的正数也就是Integer.MAX_VALUE,如果当找不到时返回Integer.MAX_VALUE,基本就可以解决问题。但是这样的话,还是担心如果给的测试用例刚好第二小的数是Interger.MAX_VALUE,那是找到了还是没找到呢。。。

 

看了一下其他人的代码,收到启发。可以定义一个long型的返回值。当找不到时,返回Integer.MAXVALUE+1,这样就既能区分找到和找不到的情况,又能愉快地使用Math.min()函数了。

 

 

 

代码:

 

结果:

 

果然快了一些,因为中间省去了很多个(每次递归都省去了4个)判断。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值