[Leetcode] Inorder Successor in BST 二叉搜索树中序下一个

news/2024/6/30 23:46:32 标签: 数据结构与算法

Inorder Successor in BST

Given a binary search tree and a node in it, find the in-order successor of that node in the BST.

Note: If the given node has no in-order successor in the tree, return null.

路径入栈法

复杂度

时间 O(N) 空间 O(N)

思路

题目给定根节点和目标节点。目标节点如果有右节点的情况比较好处理,我们只要返回它的右节点的最左边的节点就行了(右节点自己没有左节点时则是右节点本身)。如果目标节点没有右节点,说明比目标节点稍大的节点应该在上面,因为我们知道目标节点的左节点肯定是比目标节点要小的。

那怎么知道目标节点的上面是什么呢?这时就需要从根节点搜索到目标节点了。这里要注意的是,目标节点的父亲不一定比目标节点大,因为有可能目标节点的是其父亲的右孩子。所以我们要找的上面,实际上是从目标节点向根节点回溯时,第一个比目标节点大的节点。最差的情况下,如果回溯到根节点还是比目标节点要小的话,说明目标节点就是整个数最大的数了,这时候返回空。

那怎么实现目标节点向根节点回溯,这里用一个栈就行了,在我们寻找目标节点时,把路径上的节点都压入栈中。

代码

public class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        Stack<TreeNode> stk = new Stack<TreeNode>();
        TreeNode curr = root;
        // 找到目标节点并把路径上的节点压入栈
        while(curr != p){
            stk.push(curr);
            if(curr.val > p.val){
                curr = curr.left;
            } else {
                curr = curr.right;
            }
        }
        // 如果目标节点有右节点,则找到其右节点的最左边的节点,就是下一个数
        if(curr.right != null){
            curr = curr.right;
            while(curr.left != null){
                curr = curr.left;
            }
            return curr;
        } else {
        // 如果没有右节点,pop栈找到第一个比目标节点大的节点
            while(!stk.isEmpty() && stk.peek().val < curr.val){
                stk.pop();
            }
            // 如果栈都pop空了还没有比目标节点大的,说明没有更大的了
            return stk.isEmpty() ? null : stk.pop();
        }
    }
}

http://www.niftyadmin.cn/n/1132320.html

相关文章

set存放结构体应用

昨天做题发现&#xff0c;set里面放结构体&#xff0c;这怎么判断重复元素 &#xff0c;所以还是自己积累的不够多&#xff0c;我直接上代码&#xff0c;估计很容易看懂&#xff0c;具体就不再解释了 #include <iostream> #include <bits/stdc.h> using namespac…

数据化管理助力传统制造业,实现供应链上游生产车间可视化监控

本文为“数据生产力大奖赛 - 帆软”参赛案例&#xff0c;未经授权&#xff0c;请勿转载&#xff01; 引言 随着我国制造业的多元化发展&#xff0c;子公司分布零散&#xff0c;跨地区、跨国生意规模不断壮大&#xff0c;其供应链生产环节原材料库存成本增加&#xff0c;供货不…

Unity3D之UGUI学习笔记(一):UGUI介绍以及Canvas

UGUI是Unity3D4.6官方提供的UI系统&#xff0c;支持2D和3D UI的开发。 Unity3D UI史 OnGUI 在Unity4.6之前&#xff0c;官方提供的是OnGUI函数来开发UI界面&#xff0c;当然问题也比较多&#xff0c;首先不支持可视化开发&#xff0c;其次UI始终位于所有3D对象的上方&#xff0…

如何让joomla的不同页面使用不同的背景图片

为什么80%的码农都做不了架构师&#xff1f;>>> 作为一个站长最关心的就是网站的访问量&#xff0c;要使自己网站的访问量上去SEO优化是必不可少的&#xff0c;但是现在很多站长只关心网站的优化而忽视了网站界面的美 观&#xff0c;一个好的网站想要留住客户&…

javascript 浮点数加减乘除计算会有问题, 整理了以下代码来规避这个问题

/** js数学计算 add by yan*//**** 加法函数&#xff0c;用来得到精确的加法结果** 说明&#xff1a;javascript的加法结果会有误差&#xff0c;在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。** 调用&#xff1a;accAdd(arg1,arg2)** 返回值&#xff1…

为什么你的数据分析报告,总被领导打回?

咱们先来设想一个场景&#xff0c;一个会议室里坐满了人&#xff0c;正在做报告的年轻人西装笔挺&#xff0c;头发书的一丝不苟&#xff0c;PPT上列满了数据和图表&#xff0c;他正在论证一个什么东西。年轻人讲了很多&#xff0c;可是在台下听报告的一个穿着随意的大佬&#x…

讲给普通人听的分布式数据存储(转载)

转载&#xff1a;http://www.linuxeden.com/html/news/20150925/162996.html 虽然说是讲给普通人的&#xff0c;恐怕没有数据理论知识也是看不懂的&#xff0c;不过已经将的很明白了&#xff0c;个人觉得将的很不错的一点&#xff1a; 联系到我们之前的主&#xff0f;副例子&am…

window.Event参数详解

原文地址&#xff1a;window.Event参数详解作者&#xff1a;cz0090704window.evet 说明 event代表事件的状态&#xff0c;例如触发event对象的元素、鼠标的位置及状态、按下的键等等。 event对象只在事件发生的过程中才有效。 event的某些属性只对特定的事件有意义。比如&#…