代码随想录算法训练营第二十二天 | 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

34 阅读1分钟

235.二叉搜索树的最近公共祖先

701.二叉搜索树中的插入操作

450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先

  • 感想:二叉搜索树的区间思想很关键
var lowestCommonAncestor = function(root, p, q) {
    if (!root)  return root;

    if (root.val > p.val && root.val > q.val) {
        return lowestCommonAncestor(root.left, p, q);
    } else if (root.val < p.val && root.val < q.val) {
        return lowestCommonAncestor(root.right, p, q);
    }
    return root;
};

var lowestCommonAncestor = function(root, p, q) {
    while (root) {
        if (root.val > p.val && root.val > q.val) {
            root = root.left;
        } else if (root.val < p.val && root.val < q.val) {
            root = root.right;
        } else {
            return root;
        }
    }
    return root;
};

701. 二叉搜索树中的插入操作

  • 注意边界情况:根节点为空
var insertIntoBST = function(root, val) {
    if (!root) {
        return new TreeNode(val);
    }

    let node = root;
    while (node) {
        if (node.val > val) {
            if (!node.left) {
                node.left = new TreeNode(val);
                return root;
            }
            node = node.left;
        } else if (node.val < val) {
            if (!node.right) {
                node.right = new TreeNode(val);
                return root;
            }
            node = node.right;
        }
    }
    return root;
};

var insertIntoBST = function(root, val) {
    if (!root) {
        return new TreeNode(val);
    }

    if (root.val > val) root.left = insertIntoBST(root.left, val);
    if (root.val < val) root.right = insertIntoBST(root.right, val);

    return root;
};

450. 删除二叉搜索树中的节点

  • 感想:原本想着遍历树的同时创建新的树,结果越想越复杂。能清晰地梳理出5种case真是yyds
var deleteNode = function(root, key) {
    if (!root)  return root;
    if (root.val === key) {
        if (!root.left && !root.right) {
            return null;
        }
        if (!root.left && root.right) {
            return root.right;
        }
        if (root.left && !root.right) {
            return root.left;
        }
        if (root.left && root.right) {
            let node = root.right;
            while(node.left) {
                node = node.left;
            }
            node.left = root.left;
            return root.right;
        }
    }

    if (root.val > key) root.left = deleteNode(root.left, key);
    if (root.val < key) root.right = deleteNode(root.right, key);
    return root;
};