21-3-28 力扣每日刷題 173. 二叉搜尋樹迭代器
阿新 • • 發佈:2021-03-30
- 二叉搜尋樹迭代器
實現一個二叉搜尋樹迭代器類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;
}
}
}
總結 , 瞭解 中序遍歷 的拆分
下附參考原文 詳解如何對「迭代版的中序遍歷」來做等價拆分
此文章創於本人學習時的記錄,如有錯誤或更優解還請指出