BST的中序后继
二叉搜索树中的顺序后继:从BST中找到指定节点的下一个节点。

比如1的下一个是2,2的下一个是3,4的下一个是5.
思路:
方法1:递归执行中序遍历,获取list,得到p的下一个。时间O(N),空间O(N)
方法2:
递归执行中序遍历,在递归过程中获取x的下一个。如果当前值是<=x的,那么根据BST的特性只需要在右子树中找。如果当前值>x,则当前值有可能,它的左子树也有可能有更小的但是也>x的,对左子递归后,选择更接近的(更小的).
时间O(logN),空间O(logN)调用栈的深度。
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
    if(p==null||root==null){
        return null;
    }
    if(root.val<=p.val){//当前和左边都不可能>p
        return inorderSuccessor(root.right,p);
    }
    //root>p
    TreeNode res1=inorderSuccessor(root.left,p);
    if(res1!=null&&res1.val<root.val){
        return res1;
    }else{
        return root;
    }
}
方法3:循环实现
如果当前值是<=x的,那么根据BST的特性只需要在右子树中找:cur=cur.right。
如果当前值>x,则当前值有可能,它的左子树也有可能有更小的但是也>x的。则每次走入这个分支时,当前点是一个候选点,记录该节点的值和历史最小节点的值。
时间O(logN),空间O(1)
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
    if(p==null||root==null){
        return null;
    }
    TreeNode cur=root;
    TreeNode res=null;
    while(cur!=null){
        if(cur.val<=p.val){
            cur=cur.right;
        }else{
            if(res==null||res.val>cur.val){
                res=cur;
            }
            cur=cur.left;
        }
    }
    return res;
}
二叉搜索树中的中序后继 II,这道题和上面一道题是一样的,唯一的区别是节点并非普通的二叉树节点,还带有父节点指针。
循环实现:分析得出:
- 如果有右子树:则后继节点是右子的最左值。
- 否则,向上找。cur作为左子时,对于的父节点是第一个>x的值。
public Node inorderSuccessor(Node x) {
    if(x==null){
        return null;
    }
    if(x.right!=null){
        Node tmp=x.right;
        while(tmp.left!=null){
            tmp=tmp.left;
        }
        return tmp;
    }else{
        Node cur=x;
        while(cur.parent!=null&&cur!=cur.parent.left){
            cur=cur.parent;
        }
        //cur为null、cur的parent为null
        return cur.parent;
    }
}
BST的中序后继的更多相关文章
- [LeetCode] 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. No ... 
- [LeetCode] Inorder Successor in BST II 二叉搜索树中的中序后继节点之二
		Given a binary search tree and a node in it, find the in-order successor of that node in the BST. Th ... 
- [LeetCode] 285. 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. Th ... 
- [LeetCode]230. 二叉搜索树中第K小的元素(BST)(中序遍历)、530. 二叉搜索树的最小绝对差(BST)(中序遍历)
		题目230. 二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 题解 中序遍历BST,得到有序序列,返回有序序列的k-1号元素. 代 ... 
- [Swift]LeetCode285. 二叉搜索树中的中序后继节点 $ 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. Th ... 
- 4.6---找二叉树中序后继(CC150)
		因为,没有重复值,所以只需要做一个标记就OK了. public class Successor { static boolean flag = false; static int result = 0 ... 
- leetcode 94二叉树的中序遍历
		递归算法C++代码: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; ... 
- 区间dp——cf1025D二叉搜索树的中序遍历好题!
		这题帮我复习了一下BST的中序遍历.. 因为给定的数组是递增的,那么BST的中序遍历一定是1 2 3 4 5 6 7 8 9 ... n 即[l,r]为左子树,那么根节点就是r+1,反之根节点就是l- ... 
- 数据结构学习-BST二叉查找树  : 插入、删除、中序遍历、前序遍历、后序遍历、广度遍历、绘图
		二叉查找树(Binary Search Tree) 是一种树形的存储数据的结构 如图所示,它具有的特点是: 1.具有一个根节点 2.每个节点可能有0.1.2个分支 3.对于某个节点,他的左分支小于自身 ... 
随机推荐
- Excel-计算年龄、工龄  datedif()
			函数名称:DATEDIF 主要功能:计算返回两个日期参数的差值. 使用格式:=DATEDIF(date1,date2,"y").=DATEDIF(date1,date2," ... 
- Go 性能提升tips--边界检查
			1. 什么是边界检查? 边界检查,英文名 Bounds Check Elimination,简称为 BCE.它是 Go 语言中防止数组.切片越界而导致内存不安全的检查手段.如果检查下标已经越界了,就会 ... 
- 答应我,这次必须搞懂!痛点难点Promise。(小点心async/await,基于Promise的更优方案)
			Promise 出现的原因 在 Promise 出现以前,我们处理一个异步网络请求,大概是这样: // 请求 代表 一个异步网络调用. // 请求结果 代表网络请求的响应. 请求1(function( ... 
- 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(终)-配合内存管理来遍历SD卡
			[STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ... 
- Nested Classes in C++
			A nested class is a class which is declared in another enclosing class. A nested class is a member a ... 
- redis入门到精通系列(六):redis的事务详解
			(一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ... 
- 什么是maven(一)
			转自博主--一杯凉茶 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就是为了帮助那些和我一样对于m ... 
- 【Matlab】求矩阵行和/列和
			行和 sum(a, 2) 列和 sum(a) 所有元素之和 sum(sum(a)) 某一列元素之和 sum(a(:,1)) %a矩阵的第一列之和 某一行元素之和 sum(a(1,:)) %a矩阵的第一 ... 
- linux下编译php扩展
			1 在pecl.php.net搜索你需要的php扩展 2 在解压后的扩展目录运行phpize 3 执行编译./configure --with-php-config=/usr/local/php/bi ... 
- 数据类型Table.TransformColumnTypes(Power Query 之 M 语言)
			数据源: 任意数据源 目标: 设置适合的数据类型 操作过程: 选取指定列>[主页]>[数据类型]>选取 选取指定列>[转换]>[数据类型]>选取 选取指定列> ... 
