打卡代码随想录Day10

今天的目标是结束二叉树的学习。

1.二叉搜索树的插入操作(力扣701)

若插入值小于节点值,则插入到左子树,若插入值大于节点值,则插入到右子树,插入的条件为寻找到空时,否则继续用插入值与节点值比较。

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

*2.删除二叉搜索树上的节点(力扣450)

删除节点时分为四种情况讨论:

(1)删除节点无左右孩子时直接删除

(2)删除节点有左孩子没有右孩子时,左孩子直接替换被删除的节点

(3)删除节点没有左孩子有右孩子时,右孩子直接替换被删除的节点

(4)删除节点既有左孩子又有右孩子时,将删除节点的左子树移动到删除节点的右子树的最左侧节点之下,用删除节点的右孩子替换被删除的节点。

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null)
            return null;
        if(root.val == key)
        {
            //删除节点无左右孩子,直接删
            if(root.left == null && root.right == null)
                return null;
            //删除节点左孩子不为空,右孩子为空,左孩子直接补位
            if(root.left != null && root.right == null)
                return root.left;
            //删除节点左孩子为空,右孩子不为空,右孩子直接补位
            if(root.left == null && root.right != null)
                return root.right;
            //删除节点左右孩子均不为空时,则将删除节点的左子树放到删除节点的右子树的最左侧节点的左孩子上,返回删除节点右孩子为新的根节点。
            if(root.left != null && root.right != null){
                TreeNode cur = root.right;
                //找到右子树最左侧的节点
                while (cur.left!=null){
                    cur = cur.left;
                }
                cur.left = root.left;
                return root.right;
            }
        }
        if(root.val > key)
            root.left = deleteNode(root.left,key);
        if(root.val < key)
            root.right = deleteNode(root.right,key);
        return root;
    }
}

4.修剪二叉搜索树(力扣669)

递归寻找,当不满足区间范围时用满足的节点替换原节点

class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        if(root == null)
            return null;
        if(root.val < low)
            return trimBST(root.right,low,high);
        if(root.val > high)
            return trimBST(root.left,low,high);
        root.left = trimBST(root.left,low,high);
        root.right = trimBST(root.right,low,high);
        return root;
    }
}

其实无论是删除二叉树上的节点还是搜索二叉树,都需要移除其中的节点,通过递归的方式直接可以跳过需要移除的节点实现移除!

5.将有序数组转换为二叉搜索树(力扣108)

每次将有序数组分为左右两半,根据中间的数构造当前的中间节点,根据数组被分割成的左右两半,递归构造其的左右子树。

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        if(nums.length == 0)
            return null;
        if(nums.length == 1)
            return new TreeNode(nums[0]);
        TreeNode root = new TreeNode(nums[(nums.length-1)/2]);
        root.left = sortedArrayToBST(Arrays.copyOfRange(nums,0,(nums.length-1)/2));
        root.right = sortedArrayToBST(Arrays.copyOfRange(nums,(nums.length-1)/2+1,nums.length));
        return root;
    }
}

6.二叉搜索树转化为累加树(力扣538)

利用反中序遍历,每个节点的值加上前一个的。

class Solution {
    int pre = 0;
    public TreeNode convertBST(TreeNode root) {
        convertBST1(root);
        return root;
    }

//     按反中序遍历,每个节点的数值要加上前一个
    public void convertBST1(TreeNode root) {
        if (root == null) {
            return;
        }
        convertBST1(root.right);
        root.val += pre;
        pre = root.val;
        convertBST1(root.left);
    }
//    public void convertBST2(TreeNode root){
//        if(root == null)
//            return;
//        int pre = 0;
//        Deque<TreeNode> deque = new ArrayDeque<>();
//        while (!deque.isEmpty()||root!=null){
//            if(root!=null)
//            {
//                deque.push(root);
//                root = root.right;
//            }
//            else {
//                root = deque.pop();
//                root.val += pre;
//                pre = root.val;
//                root = root.left;
//            }
//        }
//    }
}
### 关于代码随想录寒假算法打卡活动 #### 活动概述 代码随想录组织的寒假算法打卡活动旨在帮助参与者通过持续练习提升编程技能。该活动通常设定在一个固定时间段内,鼓励成员每天完成一定数量或难度级别的算法题目,并分享个人心得与解决方案。 #### 参与方式 为了加入此活动,建议关注官方渠道发布的最新通知,比如微信公众号“代码随想录”。这些平台会及时公布具体的启动日期、结束时间以及如何报名参加等重要信息[^1]。 #### 题目获取途径 大多数情况下,推荐使用的习题集来自LeetCode网站上的经典问题集合。例如,在往届活动中曾涉及过关于数组操作的经典案例研究,像利用二分查找解决特定场景下的索引定位挑战等问题[^2]。 #### 规则说明 - **每日提交**:参与者需按照规定频率(通常是每天都应有所产出)上传自己的解答成果至指定交流群组或其他共享空间; - **质量要求**:除了追求速度外更重视解法的质量,提倡深入理解每道题目的核心概念并尝试多种不同的实现方法来巩固知识点; - **互动机制**:积极与其他同学展开讨论交流经验教训共同进步,形成良好的学习氛围有助于提高整体水平。 #### 社区支持 在整个过程中遇到困难时可以寻求社区的帮助和支持。以往的经验表明,许多学员都会在评论区留言提问或是创建专门的话题帖求助,而管理员和其他热心网友往往会给予耐心细致的回答指导[^3]。 ```python # 示例:简单的Python函数用于计算斐波那契数列中的某一项值 def fibonacci(n): if n <= 0: return "输入错误" elif n == 1 or n == 2: return 1 else: a, b = 1, 1 for _ in range(3, n + 1): a, b = b, a + b return b ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值