二叉树:找第二小的值
给定一棵特殊的二叉树:每个节点有0个或者2个子节点,且如果某节点有两个子节点,那么该节点的值与其最小的子节点相等。如下面的特殊二叉树,其第二小的节点为5.
方法一:由给定的条件,可知根节点肯定是值最小的节点,所以这个问题就是找子树中与根节点不相等的最小值。
public int findSecondMinimumValue(TreeNode root) { if(root == null || root.left == null) return -1; return find(root, root.val); } public int find(TreeNode root, int min){ if(root.left == null) return root.val == min ? -1 : root.val; int leftMin = find(root.left, min); int rightMin = find(root.right, min); if(leftMin == -1 || rightMin == -1) return Math.max(leftMin, rightMin); else return Math.min(leftMin, rightMin); }
方法二:把所有元素存入集合TreeSet(自动排序、不重复)中,集合中的值是按从小到大排序的,只需要输出集合中的第二个值即可。
public int findSecondMinimumValue(TreeNode root) { if ((root == null) || (root.left == null && root.right == null)) return -1; Set<Integer> set = new TreeSet<>(); dfs(root, set); Iterator<Integer> it = set.iterator(); it.next(); return (it.hasNext()) ? it.next() : -1; } private void dfs(TreeNode root, Set<Integer> set) { if (root == null) return; set.add(root.val); dfs(root.left, set); dfs(root.right, set); }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇:没有了
- 下一篇:没有了