LintCode领扣 题解丨谷歌秋招原题:二叉查找树迭代器

简介: LintCode领扣 题解丨谷歌秋招原题:二叉查找树迭代器

设计实现一个带有下列属性的二叉查找树的迭代器:

next()返回BST中下一个最小的元素

元素按照递增的顺序被访问(比如中序遍历)
next()和hasNext()的询问操作要求均摊时间复杂度是O(1)
在线评测地址:LintCode 领扣

样例 1:

输入:{10,1,11,#,6,#,12}
输出:[1, 6, 10, 11, 12]
解释:
二叉查找树如下 :
10
/\
1 11
\
6 12
可以返回二叉查找树的中序遍历 [1, 6, 10, 11, 12]
样例 2:

输入:{2,1,3}
输出:[1,2,3]
解释:
二叉查找树如下 :
2
/ \
1 3
可以返回二叉查找树的中序遍历 [1,2,3]
【题解】

这是一个非常通用的利用 stack 进行 Binary Tree Iterator 的写法。

stack 中保存一路走到当前节点的所有节点,stack.peek() 一直指向 iterator 指向的当前节点。 因此判断有没有下一个,只需要判断 stack 是否为空 获得下一个值,只需要返回 stack.peek() 的值,并将 stack 进行相应的变化,挪到下一个点。

挪到下一个点的算法如下:

如果当前点存在右子树,那么就是右子树中“一路向西”最左边的那个点
如果当前点不存在右子树,则是走到当前点的路径中,第一个左拐的点
访问所有节点用时O(n),所以均摊下来访问每个节点的时间复杂度时O(1)

public class BSTIterator {

private Stack<TreeNode> stack = new Stack<>();

// @param root: The root of binary tree.
public BSTIterator(TreeNode root) {
    while (root != null) {
        stack.push(root);
        root = root.left;
    }
}

//@return: True if there has next node, or false
public boolean hasNext() {
    return !stack.isEmpty();
}

//@return: return next node
public TreeNode next() {
    TreeNode curt = stack.peek();
    TreeNode node = curt;
    
    // move to the next node
    if (node.right == null) {
        node = stack.pop();
        while (!stack.isEmpty() && stack.peek().right == node) {
            node = stack.pop();
        }
    } else {
        node = node.right;
        while (node != null) {
            stack.push(node);
            node = node.left;
        }
    }
    
    return curt;
}

}
更多题解参考:九章算法官网

相关文章
|
小程序
119.【Uniapp】(四)
119.【Uniapp】
239 0
|
关系型数据库 MySQL
MySQL中的字符串函数有哪些?
本文介绍了几个常用的字符串函数,包括计算字符串字符数的`CHAR_LENGTH`、计算字符串长度的`LENGTH`、合并字符串的`CONCAT`和`CONCAT_WS`、替换字符串的`INSERT`,以及字母大小写转换的`LOWER`、`LCASE`、`UPPER`和`UCASE`。每个函数都有详细的说明和示例。
391 2
MySQL中的字符串函数有哪些?
|
人工智能 运维 Cloud Native
实战基于阿里云的AIGC在运维领域的探索
传统运维模式已难以应对日益复杂的海量数据和业务需求,效率低下,故障难解。而人工智能的崛起,特别是AIGC技术的出现,为运维领域带来了新的机遇。AIGC能够自动生成运维脚本、分析海量数据,预测潜在故障,甚至提供解决方案,为运维工作注入智能化力量,推动运维向更高效、更智能的方向发展。
17260 19
实战基于阿里云的AIGC在运维领域的探索
|
人工智能 编解码 语音技术
SpeechGPT 2.0:复旦大学开源端到端 AI 实时语音交互模型,实现 200ms 以内延迟的实时交互
SpeechGPT 2.0 是复旦大学 OpenMOSS 团队推出的端到端实时语音交互模型,具备拟人口语化表达、低延迟响应和多情感控制等功能。
2770 21
SpeechGPT 2.0:复旦大学开源端到端 AI 实时语音交互模型,实现 200ms 以内延迟的实时交互
|
机器学习/深度学习 自然语言处理 自动驾驶
深度学习中的自监督学习:突破数据标注瓶颈的新路径
随着深度学习在各个领域的广泛应用,数据标注的高成本和耗时逐渐成为限制其发展的瓶颈。自监督学习作为一种无需大量人工标注数据的方法,正在引起越来越多的关注。本文探讨了自监督学习的基本原理、经典方法及其在实际应用中的优势与挑战。
869 27
|
存储 监控 安全
如何保护Active Directory 的安全性?
Active Directory (AD) 是 Microsoft 的网络资源管理服务,用于存储和管理用户、文件等信息。保护 AD 至关重要,因为安全威胁者可能通过获取初始访问权限,提升权限并最终控制域管理员帐户,导致敏感数据被删除或修改。保护措施包括持续更新和打补丁、安全管理权限、实施坚不可摧的密码策略、多因素身份验证、持续审查和监控、使用安全协议、强防火墙规则、良好的备份和恢复计划、应用安全基线和基准、提高安全意识、删除不必要的帐户和标准化组名称。通过这些措施,可以有效保护 AD 环境,确保网络安全。
200 0
|
Python
python自带模块获取服务器主机名称、IP地址和mac地址
python自带模块获取服务器主机名称、IP地址和mac地址
300 1
|
存储 编译器 程序员
结构体入门&调试技巧(二)
结构体入门&调试技巧(二)
144 0
|
弹性计算 Linux 数据安全/隐私保护
DOF服务器
游戏DOF的线上服务端,在家与朋友一起游玩DOF
DOF服务器