每日算法题—二叉搜索树迭代器

题目描述

实现一个二叉搜索树迭代器,使用二叉搜索树的根节点初始化迭代器。
调用 next() 将返回二叉搜索树中的下一个最小的数。

示例

迭代器有两个方法:next() 和 hasNext()
来源:https://leetcode-cn.com/problems/binary-search-tree-iterator/

背景

二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树
简单来说就是所有节点都遵循:左节点<根节点<右节点

已知条件

TreeNode,其中只有左节点left和又节点right

思路

由于二叉搜索树的特性,最小的节点一定是最“左”的节点,第二小的节点一定是最左节点的根节点,所以按照中序遍历的方式即可得到从小到大的序列。
工具:栈
方法:从根节点开始,将根节点及其所有左节点依次入栈,每次调用next时,从栈顶出一个节点,此节点即为当前最小的节点,暂且称为节点A
考虑问题:

  1. 如果A是叶子节点,那个下一个最小节点一定是A的父节点,此时直接将A出栈即可
    2.由于前边把所有左节点都入栈了,所以L节点不可能有左节点,但是可能有右节点,如果有右节点,不妨称为R,那么当前栈顶节点(不妨称为P)一定比R大,因为L是P的左节点,所以P>L及L的所有子节点,所以下一个最小的节点一定在R及R的子节点中,现在问题变为找到R及R子节点中最小的节点,这个问题就是当前在解决的问题,只不过规模小一点而已,所以还是按照前面做的:把R及R的左节点依次入栈,此时栈顶的节点一定又是最小的节点

实现

class BSTIterator(var root: TreeNode?) {
    val stack = LinkedList<TreeNode>()

    init {
        root?.let {
            pushData(it)
        }
    }

    fun pushData(treeNode: TreeNode?) {
        treeNode?.let {
            stack.push(it) //将父节点入栈
            var node: TreeNode = it
            while (node.left != null) {//循环遍历父节点的所有左节点,依次入栈
                stack.push(node.left)
                node = node.left!!
            }
        }
    }

    //迭代器方法
    fun next(): Int {
        var node = stack.pop() //栈顶节点一定是最小的节点
        pushData(node.right)//如果当前栈顶节点的右节点不为空,那么需要把右节点中的所有左节点再次入栈,保证栈顶节点一定是最小的节点
        return node.value
    }

    //迭代器方法
    fun hasNext(): Boolean {
        return !stack.isEmpty() //栈为空则遍历完了
    }

    class TreeNode(var value: Int) {
        var left: TreeNode? = null
        var right: TreeNode? = null
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 目录 1、什么是树 2、相关术语 3、二叉树 3.1、二叉树的类型 3.2、二叉树的性质 3.3、二叉树的结构 3...
    我哈啊哈啊哈阅读 2,530评论 0 10
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,646评论 0 13
  • 目录 0.树0.1 一般树的定义0.2 二叉树的定义 1.查找树ADT 2.查找树的实现2.1 二叉查找树2.2 ...
    王侦阅读 7,112评论 0 3
  • 1)这本书为什么值得看: Python语言描述,如果学的Python用这本书学数据结构更合适 2016年出版,内容...
    孙怀阔阅读 12,434评论 0 15
  • 二叉树 二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(...
    n油炸小朋友阅读 767评论 0 1