vlambda博客
学习文章列表

【DFS&BFS】671. 二叉树中第二小的节点(简单)

让我们先来看看这道题目的描述

方法一:无脑遍历,找到次小的值(前序遍历递归版本)

/** * 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{ TreeSet<Integer> set = new TreeSet(); public int findSecondMinimumValue(TreeNode root) { dfs(root); Queue<Integer> queue = new LinkedList<>(); for(int s : set){ queue.offer(s); } if(queue.peek() != null) queue.poll(); return queue.peek() == null ? -1 : queue.peek();
}
private void dfs(TreeNode root){ if(root == null){ return; } set.add(root.val); dfs(root.left); dfs(root.right); }}

方法一:无脑遍历,找到次小的值(BFS版本)

/** * 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{ TreeSet<Integer> set = new TreeSet(); public int findSecondMinimumValue(TreeNode root) { bfs(root); Queue<Integer> queue = new LinkedList<>(); for(int s : set){ queue.offer(s); } if(queue.peek() != null) queue.poll(); return queue.peek() == null ? -1 : queue.peek();
}
private void bfs(TreeNode root){ if(root != null) set.add(root.val); Queue<TreeNode> q = new LinkedList<>(); q.offer(root); while(!q.isEmpty()){ int size = q.size(); for(int i = 0; i < size; ++i){ TreeNode cur = q.poll(); set.add(cur.val); if(cur.left != null) q.offer(cur.left); if(cur.right != null) q.offer(cur.right); }
} }}

显然这两种方法都没有用到题目给出的条件,结合一幕,我们可以分析出根节点的值一定是最小的值,我们可以用第一个大于根节点的值充当次小值,不断比较,如果遇到了比当前次小值更小的值,则将新的值设置为次小值

/** * 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 first; int second; public int findSecondMinimumValue(TreeNode root) { if(root == null) return second; first = root.val; second = -1; dfs(root); return second;
}
private void dfs(TreeNode root){ if(root == null){ return; } if (second != -1 && root.val >= second) { return; } if(root.val > first){ second = root.val; } dfs(root.left); dfs(root.right);            }}