补-代码随想录第22天| ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

本文详细探讨了在二叉搜索树中进行最近公共祖先查找、插入新节点以及删除节点的两种常见方法:递归和迭代。通过实例代码展示了如何用这两种策略处理这些问题。

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

在这里插入图片描述

思路:

一:递归

在这里插入图片描述
代码:

/**
 * 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.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;
    }
}

二:迭代-利用特性

代码:向左右分支去查找,找到则返回

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        while (true) {
            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 {
                break;
            }
        }
        return root;
    }
}

● 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);
        if(val<root.val)root.left=insertIntoBST(root.left,val);
        if(val>root.val)root.right=insertIntoBST(root.right,val);
        return root;
    }
}

思路二:迭代

/**
 * 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 newRoot = root;
        TreeNode pre = root;
        while(root!=null){
            pre=root;//存父节点
            if(val<root.val){
                root=root.left;
            }
            else if(val>root.val){
                root=root.right;
            }
        }
        if (pre.val > val) {//添加新结点
            pre.left = new TreeNode(val);
        } else {
            pre.right = new TreeNode(val);
        }
        return newRoot;

    }
}

● 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){
            // 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
            if(root.left==null&&root.right==null){
                // root=null;
                return null;
            }
            // 第三种情况:其左孩子为空,右孩子不为空,删除节点,右孩子补位 ,返回右孩子为根节点
            else if(root.left==null&&root.right!=null){
                // root=root.right;
                return root.right;
            }
             // 第四种情况:其右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
            else if(root.left!=null&&root.right==null){
                // root=root.left;
                return root.left;
            } 
            // 第五种情况:左右孩子节点都不为空,
            // 则将删除节点的左子树放到删除节点的右子树的最左面节点的左孩子的位置
            // 并返回删除节点右孩子为新的根节点。
            else{
                TreeNode cur=root.right;
                while(cur.left!=null){// 把要删除的节点(root)左子树放在cur的左孩子的位置
                    cur=cur.left;
                }
                cur.left=root.left;
                root=root.right;// 返回旧root的右孩子作为新root
                return root;
            }
        }
        if (root.val > key)root.left=deleteNode(root.left,key);
        if (root.val < key)root.right=deleteNode(root.right,key);
        return root;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值