代码随想录Day19

题目列表

  • 235.二叉搜索树的最近公共祖先(LeetCode)
  • 701.二叉搜索树中的插入操作(LeetCode)
  • 450.删除二叉搜索树中的节点(LeetCode)

解题过程

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

题目描述

解题思路

因为二叉搜索树的特性,第一时间想到迭代法,因为不用走回头路。两个二叉搜索树的节点的最近公共祖先有一个特点:祖先的 val 的大小位于 p 和 q 的 val 之间,根据这个特点不断向下遍历直到找到这个节点,这个节点一定是最近的祖先。

代码展示

//迭代法
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return null;
        
        while(root != null){
            if(root.val < p.val && root.val < q.val){
                root = root.right;
            }else if(root.val > p.val && root.val > q.val){
                root = root.left;
            }else{
                return root;
            }
        }

        return null;
    }
}

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

题目描述

解题思路

在不考虑重构树的情况下,插入节点只需要遵守二叉搜索树特性即可,一定会找到一个节点,而这个待插入的节点就是它的左孩子或右孩子。

代码展示

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root == null) return new TreeNode(val);

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

    }
}

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

题目

描述

解题思路

删除节点有五种情况:

  1. 该节点为 null
  2. 该节点为叶子节点
  3. 该节点左孩子不空右孩子空
  4. 该节点左孩子空右孩子不空
  5. 该节点左右孩子都不空

代码展示

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null) return root;

        if(key > root.val){
            root.right = deleteNode(root.right, key);
        }else if(key < root.val){
            root.left = deleteNode(root.left, key);
        }else{
            //包含是叶子节点的情况
            if(root.left == null) return root.right;
            if(root.right == null) return root.left;

            TreeNode newRoot = root.right;
            while(newRoot.left != null){
                newRoot = newRoot.left;
            }
            newRoot.left = root.left;
            return root.right;
        }
        return root;
    }
}

参考资料

代码随想录

posted @ 2025-05-17 00:53  cbdsszycfs  阅读(9)  评论(0)    收藏  举报