惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LangChain Blog
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
Microsoft Azure Blog
Microsoft Azure Blog
云风的 BLOG
云风的 BLOG
Google DeepMind News
Google DeepMind News
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
Hugging Face - Blog
Hugging Face - Blog
Y
Y Combinator Blog
D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements

博客园 - Fanny123

LeetCode最大数字范围的整数之和 LeetCode统计好子数组 LeetCode边界与内部和相等的稳定子数组 三段式数组II 变为活跃状态的最小时间 平衡装运的最大数量 三段式数组 I 相邻字符串之间的最长公共前缀 分割字符串 找出数组中的所有 K 近邻下标 使叶子路径成本相等的最小增量 硬币面值还原 检查元素频次是否为质数 等积子集的划分方案 统计一个数组中好对子的数目 LeetCode 1482. 制作 m 束花所需的最少天数 C# 基础(更新中) 圆形靶内的最大飞镖数量 丑数 验证栈序列
BST的中序后继
Fanny123 · 2019-12-11 · via 博客园 - Fanny123

二叉搜索树中的顺序后继:从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,这道题和上面一道题是一样的,唯一的区别是节点并非普通的二叉树节点,还带有父节点指针。

循环实现:分析得出:

  1. 如果有右子树:则后继节点是右子的最左值。
  2. 否则,向上找。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;
    }
}