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

60 阅读2分钟

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

题目链接:235. 二叉搜索树的最近公共祖先

思路:根据二叉搜索树的特性,我们只需要判断当前节点是否在[p,q]范围内就可以,如果在这个范围里,说明当前节点就是其最近公共祖先。

class Solution {
    // 根据二叉搜索树特性,只要当前节点在[p,q]范围内就说明是其最近祖先
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
        if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
        return root;
    }
}

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

题目链接:701. 二叉搜索树中的插入操作

思路:我们只需要根据二叉搜索树的特性,找到新节点可以插入的叶子节点的位置,将其插入到二叉搜索树的最下面即可。

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        TreeNode newNode = new TreeNode(val);
        if (root == null) return newNode;
        TreeNode i = root;
        TreeNode temp = i;
        while (i != null) {
            temp = i;
            if (i.val > val) {
                i = i.left;
            } else if (i.val < val) {
                i = i.right;
            }
        }
        if (temp.val > val) {
            temp.left = newNode;
        } else {
            temp.right = newNode;
        }
        return root;
    }
}

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

题目链接:450. 删除二叉搜索树中的节点

思路:删除二叉搜索树节点时,我们需要注意的五种情况,1、遍历到叶子节点仍然没有找到要删除的节点,返回null。2、要删除节点的左右子树均为null,直接返回null。3、要删除节点的左子树为null,直接返回右孩子。4、要删除的节点的右子树为null,直接返回左孩子。5、要删除的节点左右子树都不为null,将中序遍历过程中的下一个节点值放到当前位置,再将其删除即可。(注意:本题递归确定返回类型为节点类型,因为需要将删除节点后的子树根节点返回。)

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null) return null; // 1、到叶子节点仍然没有找到要删除的节点,返回null
        if (root.val > key) { // 当前节点大于key,从左子树中删除。
            root.left = deleteNode(root.left, key);
        } else if (root.val < key) { // 当前节点小于key,从右子树中删除
            root.right = deleteNode(root.right, key);
        } else {
            // 当前节点就时要删除的节点
            if (root.left == null) return root.right; // 2、左子树为空,直接返回右子树
            if (root.right == null) return root.left; // 3、右子树为空,直接返回左子树,4、这里若左右子树均为空,也时返回空
            // 5、左右子树都不为空
            TreeNode temp = root.right;
            while (temp.left != null) { // 找到中序的下一个节点
                temp = temp.left;
            }
            root.val = temp.val;
            root.right = deleteNode(root.right, temp.val); // 删除中序的下一个节点。
        }
        return root;
    }
}