1. 程式人生 > 其它 >21-3-28 力扣每日刷題 173. 二叉搜尋樹迭代器

21-3-28 力扣每日刷題 173. 二叉搜尋樹迭代器

  1. 二叉搜尋樹迭代器

實現一個二叉搜尋樹迭代器類BSTIterator ,表示一個按中序遍歷二叉搜尋樹(BST)的迭代器:

  • BSTIterator(TreeNode root) 初始化 BSTIterator 類的一個物件。BST 的根節點 root 會作為建構函式的一部分給出。指標應初始化為一個不存在於 BST 中的數字,且該數字小於 BST 中的任何元素。
  • boolean hasNext() 如果向指標右側遍歷存在數字,則返回 true ;否則返回 false 。
  • int next()將指標向右移動,然後返回指標處的數字。

注意,指標初始化為一個不存在於 BST 中的數字,所以對 next() 的首次呼叫將返回 BST 中的最小元素。

你可以假設 next() 呼叫總是有效的,也就是說,當呼叫 next() 時,BST 的中序遍歷中至少存在一個下一個數字。

示例:

在這裡插入圖片描述

輸入
["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[[[7, 3, 15, null, null, 9, 20
]], [], [], [], [], [], [], [], [], []] 輸出 [null, 3, 7, true, 9, true, 15, true, 20, false] 解釋 BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]); bSTIterator.next(); // 返回 3 bSTIterator.next(); // 返回 7 bSTIterator.hasNext(); // 返回 True bSTIterator.next(); // 返回 9 bSTIterator.hasNext
(); // 返回 True bSTIterator.next(); // 返回 15 bSTIterator.hasNext(); // 返回 True bSTIterator.next(); // 返回 20 bSTIterator.hasNext(); // 返回 False

提示:

樹中節點的數目在範圍 [1, 105] 內
0 <= Node.val <= 106
最多呼叫 105 次 hasNext 和 next 操作

進階:

你可以設計一個滿足下述條件的解決方案嗎?next() 和 hasNext() 操作均攤時間複雜度為 O(1) ,並使用 O(h) 記憶體。其中 h 是樹的高度。


package isLeetcode;

import java.util.ArrayDeque;
import java.util.Deque;

public class BSTIterator328 {
     public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
    }

    /**
     * 中序遍歷的基本邏輯是:處理左子樹 -> 處理當前節點 -> 處理右子樹。
     * 其中迭代做法是利用「棧」進行處理:
     * 1.先將當前節點的所有左子樹壓入棧,壓到沒有為止
     * 2.將最後一個壓入的節點彈出(棧頂元素),加入答案
     * 3.將當前彈出的節點作為當前節點,重複步驟一
     */
    Deque<TreeNode> d = new ArrayDeque<>();
    public BSTIterator328(TreeNode root) {  //初始化操作,
        // 步驟 1
        dfsLeft(root);
    }

    public int next() {
        // 步驟 2
        TreeNode root =d.pollLast();
        int res=root.val;
        // 步驟 3
        root=root.right;
        // 步驟 1
        dfsLeft(root);
        return  res;
    }

    public boolean hasNext() {
        return  !d.isEmpty();
    }

    public void dfsLeft(TreeNode root){//將當前根節點的所以左節點壓入棧
         while (root!=null){
             d.addLast(root);
             root=root.left;
         }
    }
}

總結 , 瞭解 中序遍歷 的拆分

下附參考原文 詳解如何對「迭代版的中序遍歷」來做等價拆分


此文章創於本人學習時的記錄,如有錯誤或更優解還請指出