Leetcode: Binary Search Tree Iterator

本文介绍如何使用迭代方式实现二叉搜索树(BST)的中序遍历,通过栈模拟过程,确保next()和hasNext()方法的平均时间复杂度为O(1),并分析其实际操作中的时间复杂度变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.

Calling next() will return the next smallest number in the BST.

Note: next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.

其实这道题的方法就是用迭代来中序遍历BST,用一个栈来模拟。为什么用迭代,因为迭代才可以这样一步一步地输出next元素,递归都是一口气输出完。

迭代用stack,栈的最大高度就是树的高度。

我对这道题唯一有疑问的地方在于next()的average时间复杂度要是O(1),这里average值得推敲,因为不是每次next()时间复杂度都是O(1)的。

因为一个node pop()之后,需要把它右子树node入栈,不仅如此,还需要沿着右子树node的左子树一路push下去,直到这一路全部入栈。这样做我不确定时间复杂度是O(1), 因为worst case时间复杂度可以到O(N). 比如:

                           1

                             \

                              2

                             /

                           3

                         /

                       4

1节点pop()了之后,需要把2、3、4节点依次入栈,该次复杂度达到了O(N)。但是转念想想,4、3、2出栈的时候时间复杂度都是O(1),所以average的情况可以算是O(1)吧,值得推敲。一般不是这么极端的例子,1节点右子树节点2的左节点这一路应该是常数个节点,所以average入栈时间应该是O(1)

 1 /**
 2  * Definition for binary tree
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 
11 public class BSTIterator {
12     Stack<TreeNode> st;
13 
14     public BSTIterator(TreeNode root) {
15         st = new Stack<TreeNode>();
16         pushLeft(root);
17     }
18     
19     public void pushLeft(TreeNode root) {
20         while (root != null) {
21             st.push(root);
22             root = root.left;
23         }
24     }
25 
26     /** @return whether we have a next smallest number */
27     public boolean hasNext() {
28         return !st.isEmpty();
29     }
30 
31     /** @return the next smallest number */
32     public int next() {
33         TreeNode current = st.pop();
34         pushLeft(current.right);
35         return current.val;
36     }
37 }
38 
39 /**
40  * Your BSTIterator will be called like this:
41  * BSTIterator i = new BSTIterator(root);
42  * while (i.hasNext()) v[f()] = i.next();
43  */

 

转载于:https://www.cnblogs.com/EdwardLiu/p/4254863.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值