二叉树中第二小的节点

75 阅读1分钟

给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么该节点的值等于两个子节点中较小的一个。

更正式地说,即 root.val = min(root.left.val, root.right.val) 总成立。

给出这样的一个二叉树,你需要输出所有节点中的 第二小的值

如果第二小的值不存在的话,输出 -1 

思路:

1.第一种

根节点的值是最小的值,深度遍历二叉树,找到严格大于根节点值的最小值,就是第二小的值

var findSecondMinimumValue = function(root) {
    let ans = -1
    let rootvalue = root.val
    function fs(node){
        if(node === null) return
        if(ans !== -1 && ans <= node.val ) return
        if(node.val > rootvalue){
            ans = node.val
        }
        fs(node.left)
        fs(node.right)
    }
    fs(root)
    return ans
};
2.第二种

1.当根节点两个子节点的值不同时,如果根节点的子节点没有子节点,则第二小的值为根节点连个子节点中较大的值,根节点的子节点有子节点,则第二小的值为孙子节点中较大的值与子节点中较大的值中最小的那个值......

var findSecondMinimumValue = function(root) {
    if(!root || !root.left || !root.right) return -1
    let left = root.left.val
    let right = root.right.val
    if(root.val === left) left = findSecondMinimumValue(root.left)
    if(root.val === right) right = findSecondMinimumValue(root.right)
    if(left === -1) return right
    if(right === -1) return left
    return Math.min(left,right)
};