java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
文章目录
解题思路 |
---|
- 题意表明,每个结点,都<=它的子树,也就是一个结点的后代一定不会比它大
- 则,根结点必然最小
- 而比根节点大的都可能是第二小的值
- 但是如果我们已经找到一个比根结点大的值了,记为minTwo,然后又发现了一个比这个minTwo大的,那么它必然不是第二小的,它的子树比它还大,就更不可能是了。所以遇到这种情况,就可以放弃这颗子树的遍历
- 直到最终所有结点遍历完成,找到那个比根结点的值大,但除根结点这个值外,最小的那个
代码 |
---|
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int minTwo = -1;//第二小的值,没找到返回-1
int minOne;//最小值
public int findSecondMinimumValue(TreeNode root) {
minOne = root.val;//最小值就是根结点
dfs(root);//深度优先
return minTwo;
}
public void dfs(TreeNode root){
if(root == null) return;
//如果minTwo找到了,但是当前结点值比它大,则无需向下继续遍历,因为下面的值肯定比当前结点更大
if(minTwo != -1 && root.val >= minTwo ) return;
if(root.val > minOne) minTwo = root.val;//如果当前值比最小值大,但是小于minTwo,那么它就是当前第二小
dfs(root.left);
dfs(root.right);
}
}