博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leetcode] Inorder Successor in BST 二叉搜索树中序下一个
阅读量:5962 次
发布时间:2019-06-19

本文共 1453 字,大约阅读时间需要 4 分钟。

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
stk = new Stack
(); 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://dznax.baihongyu.com/

你可能感兴趣的文章
2.db2数据库基础篇2
查看>>
BZOJ-2140: 稳定婚姻 (tarjan强连通分量)
查看>>
BZOJ-1433: [ZJOI2009]假期的宿舍 (网络流最大流经典问题)
查看>>
Linux平台Cpu使用率的计算
查看>>
Ackermann Steering System
查看>>
MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)
查看>>
C#中静态和非静态的区别
查看>>
SQL SERVER 修改数据库名称(包括 db.mdf 名称的修改)
查看>>
详解定位与定位应用
查看>>
fiddler(二)、配置抓取https协议
查看>>
在Vue中Router详细引用
查看>>
cocos2dx 实现文字的一键复制功能(IOS、Android)
查看>>
sqlserver 2012中实现字符串连接的新方法
查看>>
【419】C语言语句
查看>>
python 网络编程第一版
查看>>
PHP 简单调用rest WebServices
查看>>
php环境配置
查看>>
[转载]在Windows Azure Store上购买第三方服务
查看>>
转 Jona Dany 一个20年架构师程序员的经验总结
查看>>
this关键字
查看>>