【数据结构与算法 | 力扣+二叉搜索树篇】力扣450, 98

news2024/11/16 7:45:37

1. 力扣450:删除二叉搜索树的节点

1. 题目:

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

示例 1:

e6a16dc3738a4e91b547ba349bea5bcd.jpeg

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。


示例 2:

输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点

示例 3:

输入: root = [], key = 0
输出: []

提示:

  • 节点数的范围 [0, 104].
  • -105 <= Node.val <= 105
  • 节点值唯一
  • root 是合法的二叉搜索树
  • -105 <= key <= 105

进阶: 要求算法时间复杂度为 O(h),h 为树的高度。

2. 题解

/**
 * 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 {
    TreeNode root1;
    public TreeNode deleteNode(TreeNode root, int key) {
        root1 = root;
        TreeNode p = root;
        TreeNode parent = null;
        while (p != null) {
            if (p.val > key) {
                parent = p;
                p = p.left;
            } else if (p.val < key) {
                parent = p;
                p = p.right;
            } else {
                break;
            }
        }
        if (p == null) {
            return root;
        }
        if (p.left == null && p.right == null) {
            shift(parent, p, null);
        } else if (p.left != null && p.right == null) {
            shift(parent, p, p.left);
        } else if (p.left == null && p.right != null) {
            shift(parent, p, p.right);
        } else {
            TreeNode s = p.right;
            TreeNode sParent = p;
            while (s.left != null) {
                sParent = s;
                s = s.left;
            }
            if (p != sParent) {
                shift(sParent, s, s.right);
                s.right = p.right;
            }
            shift(parent, p, s);
            s.left = p.left;
        }

        return root1;
    }
    public void shift(TreeNode parent, TreeNode deleted, TreeNode child) {
        if (parent == null) {
            root1 = child;
        } else if (parent.left == deleted) {
            parent.left = child;
        } else {
            parent.right = child;
        }
    }
}

2. 力扣98 :验证二叉搜索树

1. 题目:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左

    子树

    只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

a0d64713dd2c49d1b3a537973809ef35.jpeg

输入:root = [2,1,3]
输出:true

示例 2:

51b6a1398ce04a01bfe1762ca55c3571.jpeg

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

2.思路(递归):

对于该题我们可以使用递归的方法去解决。由于二叉搜索树的特性,一个节点比其左孩子的值要大,比右孩子的要小(如果其有左右孩子的话),但由此条件是不够推出其是二叉搜索树的。如果某节点的值满足比其左子树的最大值要大,比其右子树的最小值要小,并且其左孩子和右孩子都满足该规则的话,是可以推出该是一个有效的二叉搜索树的。

3. 题解:

/**
 * 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 boolean isValidBST(TreeNode root) {
        return doisValidBST(root);
    }
    public boolean doisValidBST(TreeNode node) {
        // 如果是空树,直接返回
        if(node == null) {
            return true;
        }
        boolean flag = true;
        TreeNode p = null;
        // 该节点存在左子树的前提下,满足节点比左子树所有节点的最大值要大
        if ((p = node.left) != null) {
            while(p.right != null) {
                p = p.right;
            }
            flag = p.val < node.val ? true : false;
        }
        // 如果flag为false,就不必要进行下列的判断了
        if(flag){
            //在节点存在右子树的前提下,满足节点比右子树的所有节点的最小值要小
            if ((p = node.right) != null) {
            while(p.left != null) {
                p = p.left;
            }
            flag = p.val > node.val ? true : false;
        }
        }
        if(node.left == null && node.right == null) {
            return flag;
        } else if (node.left != null && node.right == null) {
            return flag==true && isValidBST(node.left);
        } else if (node.left == null && node.right != null) {
            return flag && isValidBST(node.right);
        } else {
            return flag && isValidBST(node.left) && isValidBST(node.right);
        }
    }
}

4. 思路(有序递增数列)

由题可知,中序遍历得到的序列一定是递增数列。

5. 题解:

class Solution {
    Deque<Integer> deque = new LinkedList<>();
    public boolean isValidBST(TreeNode root) {
        midTraverse(root);
        while (!deque.isEmpty()){
            int i1 = deque.pop();
            if(deque.isEmpty()){
                return true;
            }
            int i2 = deque.peek();
            if(i2 >= i1){
                return false;
            }
        }
        return true;
    }
    private void midTraverse(TreeNode node) {
        if (node == null) {
            return;
        }
        midTraverse(node.left);
        deque.push(node.val);
        midTraverse(node.right);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1992241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开个技术外挂|用自动建模工具巧妙解决电子产品连续跌落被摔的损伤,再也不怕手滑了

啪嗒&#xff0c;这是心碎的声音 消费电子、网络设备、家电等行业需要对产品进行不同区域的多次跌落试验&#xff0c;以研究产品在已有损伤的情况下&#xff0c;再次发生跌落&#xff0c;产生的影响。连续跌落仿真计算&#xff0c;可以对多次跌落产生的损伤累计进行查验&#x…

CMU15445 (Fall 2023) Project 1 - Buffer Pool 思路分享

文章目录 写在前面Task 1 - LRU-K Replacement PolicyTask 2 - Disk SchedulerTask 3 - Buffer Pool ManagerNewPageFetchPageUnpinPageDeletePageFlushPage 写在最后 写在前面 操作系统为应用程序提供了默认的缓存机制&#xff0c;DBMS作为应用程序&#xff0c;为什么不使用默…

2024年中级消防设施操作员(考前冲刺)证模拟考试题库及中级消防设施操作员(考前冲刺)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年中级消防设施操作员&#xff08;考前冲刺&#xff09;证模拟考试题库及中级消防设施操作员&#xff08;考前冲刺&#xff09;理论考试试题是由安全生产模拟考试一点通提供&#xff0c;中级消防设施操作员&#…

7.2 继承与多态:Python 面向对象编程的魔法

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

idea中怎么使用git把项目提交到远程仓库

git的版本控制 在gitignore中添加这些文件 可以在与远程仓库进行操作的时候 忽略掉这些文件夹 使用Git进行项目代码的版本控制&#xff0c;具体操作&#xff1a; 1). 创建Git本地仓库 当Idea中VS变成Git(G)&#xff1a; 说明本地仓库创建成功。 2). 创建Git远程仓库 1、gi…

Deep-Live-Cam:只需单张图像即可实现人脸替换;零一万物、月之暗面再掀国产大模型资本战丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、…

萤石开放平台开发票流程

若您已经在开放平台完成充值&#xff0c;可通过以下方式自助开票 一、PC端开票 进入开放平台首页&#xff0c;登入账号&#xff0c;进入价格页面&#xff0c;点击首页右下方的“开票指引”入口 二、萤石云视频APP 萤石云APP&#xff1a;底部导航栏“我的”——点击“订单”…

如何编写一个有效的OKR(带有示例)

客户经常问我们的一个问题是&#xff1a;”我如何写出有效的目标和关键结果&#xff1f; 我如何写出有效的目标和关键结果&#xff1f; 一开始&#xff0c;要弄清楚不同的要素是很困难的&#xff0c;而且有这么多的指导和风格&#xff0c;你很难知道自己是否做对了。 在这篇…

【Nacos无压力源码领读】(三) Nacos 配置中心与热更新原理详解 敢说全网最细

本文将从 Nacos 配置中心的基本使用入手, 详细介绍 Nacos 客户端发布配置, 拉取配置, 订阅配置的过程以及服务器对应的处理过程; 配置订阅以及热更新原理相关的部分, 我看了主流的博客网站, 绝对没有比这更详细的讲解; 如果在阅读过程中对文中提到的 SpringBoot 启动过程以及…

k8s 与 docker 安装 Syncthing 文件同步服务器

Syncthing是一个开源文件同步工具&#xff0c;可以在多台设备之间实时同步文件或文件夹&#xff0c;官方网站&#xff1a;https://syncthing.net/ 下载地址&#xff1a;https://syncthing.net/downloads/ &#xff0c;如果是windows一般推荐下载图形界面SyncTrayzor, 但我这边都…

视频循环存储的实现

目录 1. 三方工具 2. 视频存储的实现 2.1 分段存储 - 比如每15分钟 2.2 对齐到15分钟整边界 2.3 循环存储的实现 video_space_daemon.sh 3.封装 3.1 主执行程序&#xff0c;修订版 3.2 创建服务 3.3 service关联的执行脚本文件 4.额外的工作 附录A: ffmpeg视频存储…

中电金信三步法全面助力银行数字化营销体系建设

存量用户竞争时代 精细化经营、个性化服务与多场景覆盖 成为银行经营的重要策略 营销数字化转型不可或缺 但是&#xff0c;与所有转型的曲折、阵痛等特征一样&#xff0c;银行构建数字化营销运营体系过程中&#xff0c;亦走过一些弯路&#xff0c;包括&#xff1a; 缺少顶层…

收银系统源码-连锁店版本

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 私有化独立部署/全开源源码&#xff0c;系统开发语言&#xff1a; 核心开发语言: PHP、HTML…

【漏洞复现】某赛通电子文档安全管理系统 PolicyAjax SQL注入漏洞

0x01 产品简介 某赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

医药行业如何对内部机密数据进行加密保护?

一、医药行业加密解决方案 1、药品研发过程中加密保护重要数据&#xff0c;防止信息泄露 考虑到药品研发部门数据安全重要性高&#xff0c;且与其他部门较少业务关系往来&#xff0c;为防止公司研发配方泄密到其他部门或者公司外&#xff0c;研发部门实行权限控制。做到研发部…

JESD204B/C协议学习笔记

JESD204B基础概念 204B包含传输层&#xff0c;链路层&#xff0c;物理层。 应用层是对 JESD204B 进行配置的接口&#xff0c;在标准协议中是不含此层&#xff0c;只是为了便于理解&#xff0c;添加的一个层。 协议层指工程中生成的IP核JESD204B&#xff0c;负责处理输入的用户…

pod详解 list-watch机制 预选优选策略 如何指定节点调度pod

K8S是通过 list-watch 机制实现每个组件的协同工作 controller-manager、scheduler、kubelet 通过 list-watch 机制监听 apiserver 发出的事件&#xff0c;apiserver 也会监听 etcd 发出的事件 scheduler的调度策略&#xff1a; 预选策略&#xff08;Predicates&#xff09;…

JavaScript中的__setitem__方法

1、问题背景 Python中存在一个名为__setitem__的方法&#xff0c;该方法能够在向对象中设置值时对其进行处理。例如&#xff0c;以下代码演示了如何在Python中使用__setitem__方法对一个字典中的键值对进行平方处理&#xff1a; class CustomDict(dict):def __setitem__(self…

PMP证书3A一次通过攻略(内含血泪教训和踩过的坑,避雷必看)

手把手教你如何3A速通PMP证书 首先&#xff1a;你考PMP到底图什么&#xff1f; 清晰、强烈的动机是意志力的基础&#xff0c;你是想要加薪升职&#xff1f;转行转岗&#xff1f;还是只是为了知识&#xff1f;无论什么理由都可以&#xff0c;当搞明白到底图什么&#xff0c;学习…

URDF在线可视化网站

​ URDF全称&#xff08;United Robotics Description Format&#xff09;统一机器人描述格式&#xff0c;是一个XML语法框架下用来描述机器人的语言格式&#xff0c;URDF在ROS界很流行。 关于URDF的详细介绍&#xff0c;请参考博文URDF学习&#xff08;一&#xff09;什么是U…