0
点赞
收藏
分享

微信扫一扫

二叉树中第二小的节点

90哦吼 2021-09-21 阅读 104
今日算法
题目描述:
示例 1:
示例 2:
思路一:
代码实现:
class Solution {
    Set<Integer> set = new TreeSet();
    public int findSecondMinimumValue(TreeNode root) {
        dfs(root);
        if (set.size() <= 1) {
            return -1;
        }
        List<Integer> list = new ArrayList(set);
        return list.get(1);
    }

    public void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        set.add(root.val);
        if (root.left != null) {
            dfs(root.left);
        }
        if (root.right != null) {
            dfs(root.right);
        }
    }
}
思路二:
代码实现:
class Solution {
    public int result = -1;
    public int findSecondMinimumValue(TreeNode root) {
        dfs(root, root.val);
        return result;
    }
    public void dfs(TreeNode node, int rootVal) {
        if (node == null) {
            return;
        }
        // 根结点是二叉树中最小的节点,如果node.val大于result,
        // 则代表以node.val为根节点的二叉树所有元素都大于result,直接返回
        if (result != -1 && node.val >= result) {
            return;
        }
        if (node.val > rootVal) {
           result = result == -1 ? node.val : Math.min(result, node.val);
        } 
        dfs(node.left, rootVal);
        dfs(node.right, rootVal);
    }
}
思路三:
代码实现:
class Solution {
    public int result = -1;
    public int findSecondMinimumValue(TreeNode root) {
        bfs(root, root.val);
        return result;
    }
    public void bfs(TreeNode node, int rootVal) {
        if (node == null) {
            return;
        }
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(node);
        while (!queue.isEmpty()) {
            TreeNode cur = queue.poll();
            if (cur.val != rootVal) 
            result = result == -1 ? cur.val : Math.min(result, cur.val);
            if (cur.left != null) { 
                queue.offer(cur.left);   
                queue.offer(cur.right);            
            }
            
        }
    }
}
举报

相关推荐

0 条评论