二叉树:找第二小的值

    给定一棵特殊的二叉树:每个节点有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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值