【随想录】Day22—第六章 二叉树part08


题目1: 二叉搜索树的最近公共祖先


1- 思路

与二叉树的最近公共祖先思路一致


2- 题解

⭐ 二叉搜索树的最近公共祖先 ——题解思路

在这里插入图片描述

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 right;
        }else if(left != null && right==null){
            return left;
        }else if(left == null && right== null){
            return null;
        }else {
            return root;
        }
    }
}

题目2: 二叉搜索树中的插入操作


1- 思路

  • 二叉搜索树的插入,所有结点的插入位置在树的叶子结点上。
  • 因此添加节点不需要修改二叉搜索树的结构。

递归三部曲

  • 1. 递归函数参数及返回值
    • 参数为 对应的 root 和 val,返回值为 TreeNode:递归过程中遇到空向上一层返回当前递归的结果
  • 2. 终止条件 && 结果收集
    • 遇到 null 则证明递归找到了插入位置,因此 返回新建的结点
  • 3. 单层递归
    • 根据二叉搜索树的性质,当前元素若比 root.val 大则向右递归,若比 root.val 小则向左递归

2- 题解

⭐ 二叉搜索树中的插入操作 ——题解思路

在这里插入图片描述

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

题目3: 删除二叉搜索树中的节点


1- 思路

删除结点有很多情况需要考虑

  • ① 没找到需要删除的结点
  • 找到删除结点
    • ② 找到删除结点为 叶子结点:左右都为空
    • ③ 需要删除的结点 非叶子结点:左不空 右为空 ——> 让当前结点的父节点指向当前节点的左节点
    • ④ 需要删除的结点 非叶子结点:左为空 右不空 ——> 让当前结点的父节点指向当前结点的右结点
    • ⑤ 🔑需要删除的结点 非叶子结点:_左不空 右不空 _——> 最复杂,如果删除当前结点,则当前结点的 左子树 拼接到 当前结点 的 右结点的最左下的结点左子树上

疑问

  • 如何同时操作当前结点,以及当前节点与父节点的关系?

递归三部曲

  • 2. 终止条件
    • 终止条件为找到被删除的节点,因此删除逻辑也在终止条件中

2- 题解

⭐ 删除二叉搜索树中的节点 ——题解思路

在这里插入图片描述

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        // 终止条件
        if(root==null){
            return null;
        }else if(root.val == key){
            // 四种情况
            if(root.left!= null && root.right==null){
                return root.left;
            }else if(root.left==null && root.right!=null){
                return root.right;
            }else if(root.left == null && root.right==null){
                return null;
            }else if(root.left!=null && root.right!=null){
                TreeNode cur = root.right;
                while(cur.left!=null){
                    cur = cur.left;
                }
                cur.left = root.left;
                root = root.right;
                return root;
            }
        }

        if(key>root.val){
            root.right = deleteNode(root.right,key);
        }
        if(key<root.val){
            root.left = deleteNode(root.left,key);
        }
        return root;
    }
}

  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值