【前端er每日算法】二叉树3题--530二叉搜索树的最小绝对差/501二叉搜索树中的众数/236二叉树的最近公共祖先

90 阅读1分钟

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

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

思路

一次ac通过,开森😄,思路上上一道做的题基本一样,中序遍历二叉树,记录前一个节点,如果上一个节点有值,则比较当前节点和上一个节点的差值,和最小差值做比较并记录。

var getMinimumDifference = function(root) {
    let pre;
    let min = Number.MAX_VALUE;

    var inorder = root => {
        if (!root) {
            return
        }
        inorder(root.left);
        if (pre) {
            let diff = Math.abs(root.val - pre.val);
            if (pre && diff < min) {
                min = diff;
            }
        }
        pre = root;
        inorder(root.right);
    }
    inorder(root);
    return min;
};

题目二 501. 二叉搜索树中的众数

思路

利用二叉树的特性,依然使用pre指针,指向上一个元素,

单层递归逻辑:

  • 如果pre没有,说明是第一个元素,count = 1;如果pre = cur,则count++,否则,count 重新开始计数变为1。

  • 计算完当前node的count后,判断count和max的大小,如果大于,则result清空,放进当前元素,如果等于,则push当前元素。

其余就是递归逻辑。

var findMode = function(root) {
    let result = [];
    let maxCount = 0;
    let count = 0;
    let pre;
    if (!root.left && !root.right) {
        return [root.val];
    }
    var inorder = root => {
        if (!root) {
            return;
        }
        inorder(root.left);
        if (!pre) {
            count = 1;
        } else if (root.val === pre.val) {
            count++;
        } else {
            count = 1;
        }
        pre = root;
        if (count > maxCount) {
            maxCount = count;
            result = [root.val]
        } else if (count === maxCount) {
            result.push(root.val);
        }
        inorder(root.right);
    }
    inorder(root);
    return result;
};

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

思路

如果遇到p,则返回p,如果遇到q,返回q,如果左右子树返回之都不为空,说明找到了最近公共祖先,如果为空,右不为空,返回右节点,如果左不为空,右为空,返回左节点。

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