当前位置: 首页 > news >正文

【leetcode】【剑指offer Ⅱ】053. 二叉搜索树中的中序后继

问题描述:

  • 给定一棵二叉搜索树和其中的一个节点 p,找到该节点在树中的中序后继。如果节点没有中序后继,请返回 null
    • 节点 p 的后继是值比 p.val 大的节点中键值最小的节点,即按中序遍历的顺序节点 p 的下一个节点。

核心思路:

  • 该题有两种解题方法。
  • 方法一:中序遍历二叉搜索树,用两个变量记录当前节点与前一个节点。
    • 如果上一个访问的节点是节点 p,则当前访问节点是 p 的中序后继。
  • 方法二:利用二叉搜索树的性质。
    • 如果 root -> val <= p -> val,则结果必定在 root 的右子树中。
    • 否则结果必定在 root 的左子树中或这就是 root

代码实现:

  • 方法一代码实现如下:
    class Solution
    {
    private:
        TreeNode* cur = nullptr;
        TreeNode* next = nullptr;
        void dfs(TreeNode* root, TreeNode* p)
        {
            if(!root) return;
            dfs(root->left, p);
            if(cur)
            {
                next = next ? next : root;
                return;
            }
            if(root == p) cur = p;
            dfs(root->right, p);
            return;
        }
    public:
        TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p)
        {
            dfs(root, p);
            return next;
        }
    };
    
  • 方法二代码实现如下:【下述代码为递归版本,代码贴自评论区】
    class Solution {
    public:
        TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
            if (!root) return root;
    
            if (root -> val <= p -> val) 
                return inorderSuccessor(root -> right, p);
            
            auto left = inorderSuccessor(root -> left, p);
            return !left ? root : left;
        }
    };
    

相关文章:

  • 实现 ECharts 图表自适应
  • 【Linux】信号 —— 信号的产生 | 信号的保存 | 信号的处理 | 可重入函数 | volalite关键字 | SIGCHLD
  • A Survey of Deep Learning-based Object Detection
  • Java新手小白入门篇 API -Socket网络编程
  • kafka如何保证消息不丢失?半分钟的答案和半个小时的答案有点不一样。
  • Java学习----集合1
  • PBR概念及PBR核心理论和渲染原理
  • 5.5如何去除有序数组的重复元素
  • PBR标准化工作流程
  • Vue学习第17天——netTick()的原理及使用
  • 英语语法精讲合集
  • 如何用数据采集网关快速采集工业现场数据,怎么搭建MQTT服务器?
  • Vue中的样式绑定
  • 大学网课答案公众号题库搭建
  • torch.utils.data
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JS 面试题总结
  • JS变量作用域
  • linux安装openssl、swoole等扩展的具体步骤
  • Yeoman_Bower_Grunt
  • 阿里云购买磁盘后挂载
  • 关于List、List?、ListObject的区别
  • 使用agvtool更改app version/build
  • 微服务入门【系列视频课程】
  • 为视图添加丝滑的水波纹
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • ​MySQL主从复制一致性检测
  • #if 1...#endif
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $.ajax,axios,fetch三种ajax请求的区别
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (poj1.2.1)1970(筛选法模拟)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (接口封装)
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .net refrector
  • .NET 的程序集加载上下文
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .net下简单快捷的数值高低位切换
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • ??myeclipse+tomcat
  • [100天算法】-实现 strStr()(day 52)
  • [20150629]简单的加密连接.txt
  • [Android] 修改设备访问权限
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [BZOJ] 3262: 陌上花开
  • [bzoj1038][ZJOI2008]瞭望塔