前端算法系列-二叉树06

38 阅读1分钟

530. 二叉搜索树的最小绝对差

总体思路还是中序遍历,二叉搜索树相当于一个递增数组,最小差值只可能产生在两个相邻的值之中,统计前一个节点和当前节点的差值并不断更新即可

var getMinimumDifference = function(root) {
    let dif = Infinity
    let pre = null
    let difFn = (root) => {
        if(!root) return
        difFn(root.left)
        if(pre){
            dif = Math.min(dif,Math.abs(pre.val - root.val))
        }
        pre = root
        difFn(root.right)
    }
    difFn(root)
    return dif
};

501. 二叉搜索树中的众数

自己第一遍过的时候的代码,感觉代码太冗余了 看题解了之后发现答案和我的解法差不多 但是if(res.indexOf(root.val) === -1)这个判断逻辑可以去掉,没什么用

var findMode = function(root) {
    let maxTime = 0
    let tempTime = 0
    let res = []
    let pre = null
    let fn = (root) => {
        if(!root) return
        fn(root.left)
        if(!pre){
            tempTime++
        }else{
            if(pre.val === root.val){
                tempTime++
            }else{
                tempTime = 1
            }
        }
        if(tempTime > maxTime){
            maxTime = tempTime
            res = [root.val]
        }else if(tempTime === maxTime){
            if(res.indexOf(root.val) === -1){
                res.push(root.val)
            }
        }
        pre = root
        fn(root.right)
    }
    fn(root)
    return res
};

236. 二叉树的最近公共祖先

这题代码只有几行,但是不仔细思考的话是想不出来这个思路的

var lowestCommonAncestor = function(root, p, q) {
    if(!root || root === p || root === q) return root
    let left = lowestCommonAncestor(root.left,p,q)
    let right = lowestCommonAncestor(root.right,p,q)
    if(left && right) return root
    return (left || right)
};