|
【题目】
【分析】 根节点的值肯定是最小的。每个节点的值<=子节点的值。越往下越大。
只要找到左边第一个比根大的节点和右边第一个比根大的节点,然后看看谁小就行了。
怎么找到左边第一个比根大的节点呢? 如果左孩子比根大,那么左孩子就是第一个比根大的节点,而且不需要往下再找。 如果左孩子等于根的值,那么就递归地往下找。
即: 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个)判断。
|
博客围绕求二叉树中第二小的节点展开,聚焦于二叉树相关信息技术问题。







被折叠的 条评论
为什么被折叠?



