Day 22 | 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点

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

题目
文章讲解
视频讲解

思路:根据二叉搜索树的性质,从根节点开始便利,即前序遍历,遇见的第一个cur结点值在p,q中间的就是我们要找的二叉搜索树的最近公共祖先。

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 如果根节点的值大于p和q的值,则p和q在根节点的左子树中
        if(root.val > p.val && root.val > q.val)
            return lowestCommonAncestor(root.left, p, q);
        // 如果根节点的值小于p和q的值,则p和q在根节点的右子树中
        if(root.val < p.val && root.val < q.val)
            return lowestCommonAncestor(root.right, p, q);
        // 如果以上条件都不满足,则说明p和q分别位于根节点的左右子树中,根节点即为它们的最近公共祖先
        return root;
    }
}

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

题目
文章讲解
视频讲解

思路:按照二叉搜索树的规则去遍历,遇到空节点就插入节点


class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null) {
            TreeNode node = new TreeNode(val);
            return node;
        }
        if (root.val >= val)
            root.left = insertIntoBST(root.left, val);
        if (root.val < val)
            root.right = insertIntoBST(root.right, val);
        return root;
    }
}

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

题目
文章讲解
视频讲解

思路:

  • 第一种情况:没找到删除的节点,遍历到空节点直接返回了 找到删除的节点
  • 第二种情况:左右孩子都为空(叶子节点),直接删除节点,返回NULL为根节点
  • 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
  • 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
  • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        // 如果根节点为空,直接返回null
        if (root == null)
            return root;
        // 如果找到要删除的节点
        if (root.val == key) {
            // 如果要删除的节点没有左子树,直接返回右子树
            if (root.left == null) {
                return root.right;
            } 
            // 如果要删除的节点没有右子树,直接返回左子树
            else if (root.right == null) {
                return root.left;
            } 
            // 如果要删除的节点左右子树都不为空
            else {
                // 找到右子树中最小的节点
                TreeNode cur = root.right;
                while (cur.left != null) {
                    cur = cur.left;
                }
                // 将要删除的节点的左子树连接到右子树中最小节点的左子树
                cur.left = root.left;
                // 返回右子树作为新的根节点
                root = root.right;
                return root;
            }
        }
        // 如果要删除的节点值小于当前节点值,在左子树中继续删除操作
        if (root.val > key)
            root.left = deleteNode(root.left, key);
        // 如果要删除的节点值大于当前节点值,在右子树中继续删除操作
        if (root.val < key)
            root.right = deleteNode(root.right, key);
        return root;
    }
}

你可能感兴趣的:(二月红,java,力扣)