当前位置:   article > 正文

二叉搜索树迭代器_二叉树迭代器

二叉树迭代器

一、需求

  • 实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器;

  • 调用 next() 将返回二叉搜索树中的下一个最小的数。

     

BSTIterator iterator = new BSTIterator(root);
iterator.next();    // 返回 3
iterator.next();    // 返回 7
iterator.hasNext(); // 返回 true
iterator.next();    // 返回 9
iterator.hasNext(); // 返回 true
iterator.next();    // 返回 15
iterator.hasNext(); // 返回 true
iterator.next();    // 返回 20
iterator.hasNext(); // 返回 false

提示:

next() 和 hasNext() 操作的时间复杂度是 O(1),并使用 O(h) 内存,其中 h 是树的高度。
你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 中至少存在一个下一个最小的数(将这下一个最小的数看作一个整体)。

二、扁平化二叉树

2.1  思路分析

  1. 所谓扁平化二叉树就是把二叉树拉直,我们将BST的中序遍历存储到集合中,这样集合中的元素是升序排序,通过一个索引指向"下一个最小元素";
  2. 注意该方法的均摊时间复杂度为O(1),空间复杂度为O(N),不符合题目要求的O(h)内存;

2.2  代码实现

  1. class BSTIterator {
  2. List<Integer> res;
  3. int index;
  4. public BSTIterator(TreeNode root) {
  5. res = new ArrayList<>();
  6. index = 0;
  7. infixOrder(root);
  8. }
  9. public int next() {
  10. int tmp = res.get(index);
  11. index++;
  12. return tmp;
  13. }
  14. public boolean hasNext() {
  15. if(index < res.size()) {
  16. return true;
  17. } else {
  18. return false;
  19. }
  20. }
  21. public void infixOrder(TreeNode root) {
  22. if(root == null) {
  23. return;
  24. }
  25. infixOrder(root.left);
  26. res.add(root.val);
  27. infixOrder(root.right);
  28. }
  29. }

2.3  复杂度分析

  • 均摊时间复杂度为O(1),执行1次构造方法、N次next()、N次hasNext()总的操作次数3N,平均操作次数为3,故均摊时间复杂度为O(1);
  • 空间复杂度为O(N),集合存储BST的中序遍历消耗O(N)的额外空间;

三、迭代法

3.1  思路分析

  1. 在这里我们利用迭代法获得中序遍历的思想,在迭代过程中进行处理,而不是像方法2等递归结束后再进行处理;
  2. 利用栈结构实现,定义一个方法,功能是将当前节点及其左子树入栈;

3.2  代码实现

  1. class BSTIterator {
  2. Deque<TreeNode> stack;
  3. public BSTIterator(TreeNode root) {
  4. stack = new ArrayDeque<>();
  5. addLeftTree(root);
  6. }
  7. public int next() {
  8. TreeNode node = stack.pop();
  9. if(node.right != null) {
  10. addLeftTree(node.right);
  11. }
  12. return node.val;
  13. }
  14. public boolean hasNext() {
  15. return stack.size() > 0;
  16. }
  17. private void addLeftTree(TreeNode node) {
  18. while(node != null) {
  19. stack.push(node);
  20. node = node.left;
  21. }
  22. }
  23. }

3.3  复杂度分析

  • 均摊时间复杂度为O(1);
  • 空间复杂度为O(log2N),消耗的空间相当于树的深度h;

四、学习地址

作者:LeetCode

链接:https://leetcode-cn.com/problems/binary-search-tree-iterator/solution/er-cha-sou-suo-shu-die-dai-qi-by-leetcode/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/569399
推荐阅读
相关标签
  

闽ICP备14008679号