代码随想录算法训练营第二十天 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

56 阅读1分钟

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

501.二叉搜索树中的众数

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

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

关键点:双指针 <=> 用全局变量保存上一个节点

var getMinimumDifference = function(root) {
    let res = null;
    let pre = null;

    const traverse = (node) => {
        if (!node)  return;

        traverse(node.left);
        if (pre) {
            const v = Math.abs(node.val - pre.val);
            res = res ? Math.min(res, v) : v;
        }
        pre = node;
        traverse(node.right);
    }

    traverse(root);
    return res;
};

501. 二叉搜索树中的众数

关键点:出现新的最大频率时清空结果集

var findMode = function(root) {
    let res = [];
    let maxCnt = 0;
    let cnt = 0;
    let pre = null;

    const traverse = (node) => {
        if (!node)  return;

        traverse(node.left);
        if (pre) {
            if (pre.val === node.val)   cnt += 1;
            else    cnt = 1;
        } else {
            cnt = 1;
        }
        pre = node;

        if (cnt === maxCnt) {
            res.push(node.val);
        }
        if (cnt > maxCnt) {
            maxCnt = cnt;
            res = [];
            res.push(node.val);
        }
        traverse(node.right);
    }

    traverse(root);
    return res;
};

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

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

    if (!l && !r)   return null;
    if (l && !r)    return l;
    if (!l && r)    return r;
    if (l && r)     return root;
};