博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode----173. Binary Search Tree Iterator
阅读量:4112 次
发布时间:2019-05-25

本文共 1970 字,大约阅读时间需要 6 分钟。

链接:

大意:

构造一棵BST的迭代器,迭代器通过往构造函数传入树根节点得到,实现迭代器的两个函数next()和hasNext(),用于获得迭代器的下一个元素以及判断是否有下一个元素。例子:

思路:

在构造迭代器时(构造函数内),使用一个list存储BST中序遍历,并设置一个实例域currIdx为当前遍历到迭代器的位置,另一个实例域size为BST中序遍历的长度。具体代码如下。

代码:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class BSTIterator {    private ArrayList
order = new ArrayList<>(); private int currIdx; private int size; public BSTIterator(TreeNode root) { inOrder(root); currIdx = -1; size = order.size(); } /** @return the next smallest number */ public int next() { if (hasNext()) return order.get(++currIdx); return -1; // 表示不存在下一个元素 } /** @return whether we have a next smallest number */ public boolean hasNext() { return currIdx < size - 1; } private void inOrder(TreeNode root) { if (root == null) return ; inOrder(root.left); order.add(root.val); inOrder(root.right); } }/** * Your BSTIterator object will be instantiated and called as such: * BSTIterator obj = new BSTIterator(root); * int param_1 = obj.next(); * boolean param_2 = obj.hasNext(); */

结果:

结论:

next()和hasNext()的时间复杂度均为O(1)。使用的空间复杂度为O(n),n为树节点的个数。题目最后的提示是最优解法的空间复杂度为O(h),h为树的高度。有待改进。。。

最佳:

class BSTIterator {    LinkedList
st; public BSTIterator(TreeNode root) { st = new LinkedList<>(); while (root != null) { st.offerFirst(root); root = root.left; } } public int next() { int val = st.peekFirst().val; TreeNode n= st.pollFirst(); TreeNode r = n.right; while (r!=null) { st.offerFirst(r); r = r.left; } return val; } public boolean hasNext() { return !st.isEmpty(); }}

方法确实巧妙。首先存储左斜枝的节点值,待next拿掉一个当前最小的节点后,将被拿节点的右子树作为新的root,将root以及的左斜枝添加到list首部中。 

 

转载地址:http://waesi.baihongyu.com/

你可能感兴趣的文章
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>
JavaSE_day14 集合中的Map集合_键值映射关系
查看>>
Day_15JavaSE 异常
查看>>
异常 Java学习Day_15
查看>>
JavaSE_day_03 方法
查看>>
day-03JavaSE_循环
查看>>
Mysql初始化的命令
查看>>
day_21_0817_Mysql
查看>>
day-22 mysql_SQL 结构化查询语言
查看>>
MySQL关键字的些许问题
查看>>
浅谈HTML
查看>>
css基础
查看>>