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

题目描述

实现一个二叉搜索树迭代器,使用二叉搜索树的根节点初始化迭代器。
调用 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
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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