【算法刷题day22】Leetcode:235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

发布于:2024-04-15 ⋅ 阅读:(153) ⋅ 点赞:(0)

草稿图网站
java的Deque

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

题目:235. 二叉搜索树的最近公共祖先
解析:代码随想录解析

解题思路

法1:和人二叉树的最近公共祖先一样的遍历搜索方法。

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q)
            return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if (left == null &&right == null)
            return null;
        else if (left != null && right == null)
            return left;
        else if (left == null && right != null)
            return right;
        else
            return root;
    }
}

//递归
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (p.val < root.val && q.val < root.val)   return lowestCommonAncestor(root.left, p, q);
        if (p.val > root.val && q.val > root.val)   return lowestCommonAncestor(root.right, p, q);
        return root;
    }
}

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

总结

利用好二叉搜索树的有序性

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

题目:701. 二叉搜索树中的插入操作
解析:代码随想录解析

解题思路

迭代和递归

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if (root == null)
            return new TreeNode(val);
        TreeNode pre = null;
        TreeNode cur = root;
        while (cur != null) {
            if (val < cur.val) {
                pre = cur;
                cur = cur.left;
            } else if (val > cur.val) {
                pre = cur;
                cur = cur.right;
            }
            
        }
        if (val < pre.val)
            pre.left = new TreeNode(val);
        else
            pre.right = new TreeNode(val);
        return root;
    }
}

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

总结

根据二叉搜索树的性质

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

题目:450. 删除二叉搜索树中的节点
解析:代码随想录解析

解题思路

在这里插入图片描述
应该为左为空,右为空,左右都不为空的情况

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        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.left;
                while (cur.right != null)
                    cur = cur.right;
                cur.right = root.right;
                root = root.left;
                return root;
            }
        }
        if (key < root.val) root.left = deleteNode(root.left, key);
        if (key > root.val) root.right = deleteNode(root.right, key);
        return root;
    }
}

总结

暂无


网站公告

今日签到

点亮在社区的每一天
去签到