返回介绍

solution / 0100-0199 / 0173.Binary Search Tree Iterator / README_EN

发布于 2024-06-17 01:04:03 字数 16410 浏览 0 评论 0 收藏 0

173. Binary Search Tree Iterator

中文文档

Description

Implement the BSTIterator class that represents an iterator over the in-order traversal of a binary search tree (BST):

  • BSTIterator(TreeNode root) Initializes an object of the BSTIterator class. The root of the BST is given as part of the constructor. The pointer should be initialized to a non-existent number smaller than any element in the BST.
  • boolean hasNext() Returns true if there exists a number in the traversal to the right of the pointer, otherwise returns false.
  • int next() Moves the pointer to the right, then returns the number at the pointer.

Notice that by initializing the pointer to a non-existent smallest number, the first call to next() will return the smallest element in the BST.

You may assume that next() calls will always be valid. That is, there will be at least a next number in the in-order traversal when next() is called.

 

Example 1:

Input
["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
Output
[null, 3, 7, true, 9, true, 15, true, 20, false]

Explanation
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next(); // return 3
bSTIterator.next(); // return 7
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 9
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 15
bSTIterator.hasNext(); // return True
bSTIterator.next(); // return 20
bSTIterator.hasNext(); // return False

 

Constraints:

  • The number of nodes in the tree is in the range [1, 105].
  • 0 <= Node.val <= 106
  • At most 105 calls will be made to hasNext, and next.

 

Follow up:

  • Could you implement next() and hasNext() to run in average O(1) time and use O(h) memory, where h is the height of the tree?

Solutions

Solution 1

# Definition for a binary tree node.
# class TreeNode:
#   def __init__(self, val=0, left=None, right=None):
#     self.val = val
#     self.left = left
#     self.right = right
class BSTIterator:
  def __init__(self, root: TreeNode):
    def inorder(root):
      if root:
        inorder(root.left)
        self.vals.append(root.val)
        inorder(root.right)

    self.cur = 0
    self.vals = []
    inorder(root)

  def next(self) -> int:
    res = self.vals[self.cur]
    self.cur += 1
    return res

  def hasNext(self) -> bool:
    return self.cur < len(self.vals)


# Your BSTIterator object will be instantiated and called as such:
# obj = BSTIterator(root)
# param_1 = obj.next()
# param_2 = obj.hasNext()
/**
 * Definition for a binary tree node.
 * 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;
 *   }
 * }
 */
class BSTIterator {
  private int cur = 0;
  private List<Integer> vals = new ArrayList<>();

  public BSTIterator(TreeNode root) {
    inorder(root);
  }

  public int next() {
    return vals.get(cur++);
  }

  public boolean hasNext() {
    return cur < vals.size();
  }

  private void inorder(TreeNode root) {
    if (root != null) {
      inorder(root.left);
      vals.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();
 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *   int val;
 *   TreeNode *left;
 *   TreeNode *right;
 *   TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *   TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *   TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class BSTIterator {
public:
  vector<int> vals;
  int cur;
  BSTIterator(TreeNode* root) {
    cur = 0;
    inorder(root);
  }

  int next() {
    return vals[cur++];
  }

  bool hasNext() {
    return cur < vals.size();
  }

  void inorder(TreeNode* root) {
    if (root) {
      inorder(root->left);
      vals.push_back(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();
 * bool param_2 = obj->hasNext();
 */
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */
type BSTIterator struct {
  stack []*TreeNode
}

func Constructor(root *TreeNode) BSTIterator {
  var stack []*TreeNode
  for ; root != nil; root = root.Left {
    stack = append(stack, root)
  }
  return BSTIterator{
    stack: stack,
  }
}

func (this *BSTIterator) Next() int {
  cur := this.stack[len(this.stack)-1]
  this.stack = this.stack[:len(this.stack)-1]
  for node := cur.Right; node != nil; node = node.Left {
    this.stack = append(this.stack, node)
  }
  return cur.Val
}

func (this *BSTIterator) HasNext() bool {
  return len(this.stack) > 0
}

/**
 * Your BSTIterator object will be instantiated and called as such:
 * obj := Constructor(root);
 * param_1 := obj.Next();
 * param_2 := obj.HasNext();
 */
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *   val: number
 *   left: TreeNode | null
 *   right: TreeNode | null
 *   constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 *   }
 * }
 */

class BSTIterator {
  private data: number[];
  private index: number;

  constructor(root: TreeNode | null) {
    this.index = 0;
    this.data = [];
    const dfs = (root: TreeNode | null) => {
      if (root == null) {
        return;
      }
      const { val, left, right } = root;
      dfs(left);
      this.data.push(val);
      dfs(right);
    };
    dfs(root);
  }

  next(): number {
    return this.data[this.index++];
  }

  hasNext(): boolean {
    return this.index < this.data.length;
  }
}

/**
 * Your BSTIterator object will be instantiated and called as such:
 * var obj = new BSTIterator(root)
 * var param_1 = obj.next()
 * var param_2 = obj.hasNext()
 */
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
//   pub val: i32,
//   pub left: Option<Rc<RefCell<TreeNode>>>,
//   pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
//   #[inline]
//   pub fn new(val: i32) -> Self {
//   TreeNode {
//     val,
//     left: None,
//     right: None
//   }
//   }
// }
struct BSTIterator {
  vals: Vec<i32>,
  index: usize,
}

use std::rc::Rc;
use std::cell::RefCell;
/**
 * `&self` means the method takes an immutable reference.
 * If you need a mutable reference, change it to `&mut self` instead.
 */
impl BSTIterator {
  fn inorder(root: &Option<Rc<RefCell<TreeNode>>>, res: &mut Vec<i32>) {
    if let Some(node) = root {
      let node = node.as_ref().borrow();
      Self::inorder(&node.left, res);
      res.push(node.val);
      Self::inorder(&node.right, res);
    }
  }

  fn new(root: Option<Rc<RefCell<TreeNode>>>) -> Self {
    let mut vals = vec![];
    Self::inorder(&root, &mut vals);
    BSTIterator {
      vals,
      index: 0,
    }
  }

  fn next(&mut self) -> i32 {
    self.index += 1;
    self.vals[self.index - 1]
  }

  fn has_next(&self) -> bool {
    self.index != self.vals.len()
  }
}/**
 * Your BSTIterator object will be instantiated and called as such:
 * let obj = BSTIterator::new(root);
 * let ret_1: i32 = obj.next();
 * let ret_2: bool = obj.has_next();
 */
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *   this.val = (val===undefined ? 0 : val)
 *   this.left = (left===undefined ? null : left)
 *   this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 */
var BSTIterator = function (root) {
  this.stack = [];
  for (; root != null; root = root.left) {
    this.stack.push(root);
  }
};

/**
 * @return {number}
 */
BSTIterator.prototype.next = function () {
  let cur = this.stack.pop();
  let node = cur.right;
  for (; node != null; node = node.left) {
    this.stack.push(node);
  }
  return cur.val;
};

/**
 * @return {boolean}
 */
BSTIterator.prototype.hasNext = function () {
  return this.stack.length > 0;
};

/**
 * Your BSTIterator object will be instantiated and called as such:
 * var obj = new BSTIterator(root)
 * var param_1 = obj.next()
 * var param_2 = obj.hasNext()
 */

Solution 2

# Definition for a binary tree node.
# class TreeNode:
#   def __init__(self, val=0, left=None, right=None):
#     self.val = val
#     self.left = left
#     self.right = right
class BSTIterator:
  def __init__(self, root: TreeNode):
    self.stack = []
    while root:
      self.stack.append(root)
      root = root.left

  def next(self) -> int:
    cur = self.stack.pop()
    node = cur.right
    while node:
      self.stack.append(node)
      node = node.left
    return cur.val

  def hasNext(self) -> bool:
    return len(self.stack) > 0


# Your BSTIterator object will be instantiated and called as such:
# obj = BSTIterator(root)
# param_1 = obj.next()
# param_2 = obj.hasNext()
/**
 * Definition for a binary tree node.
 * 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;
 *   }
 * }
 */
class BSTIterator {
  private Deque<TreeNode> stack = new LinkedList<>();

  public BSTIterator(TreeNode root) {
    for (; root != null; root = root.left) {
      stack.offerLast(root);
    }
  }

  public int next() {
    TreeNode cur = stack.pollLast();
    for (TreeNode node = cur.right; node != null; node = node.left) {
      stack.offerLast(node);
    }
    return cur.val;
  }

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

/**
 * 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();
 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *   int val;
 *   TreeNode *left;
 *   TreeNode *right;
 *   TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *   TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *   TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class BSTIterator {
public:
  stack<TreeNode*> stack;
  BSTIterator(TreeNode* root) {
    for (; root != nullptr; root = root->left) {
      stack.push(root);
    }
  }

  int next() {
    TreeNode* cur = stack.top();
    stack.pop();
    TreeNode* node = cur->right;
    for (; node != nullptr; node = node->left) {
      stack.push(node);
    }
    return cur->val;
  }

  bool hasNext() {
    return !stack.empty();
  }
};

/**
 * Your BSTIterator object will be instantiated and called as such:
 * BSTIterator* obj = new BSTIterator(root);
 * int param_1 = obj->next();
 * bool param_2 = obj->hasNext();
 */
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *   val: number
 *   left: TreeNode | null
 *   right: TreeNode | null
 *   constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 *   }
 * }
 */

class BSTIterator {
  private stack: TreeNode[];

  constructor(root: TreeNode | null) {
    this.stack = [];
    const dfs = (root: TreeNode | null) => {
      if (root == null) {
        return;
      }
      this.stack.push(root);
      dfs(root.left);
    };
    dfs(root);
  }

  next(): number {
    const { val, right } = this.stack.pop();
    if (right) {
      let cur = right;
      while (cur != null) {
        this.stack.push(cur);
        cur = cur.left;
      }
    }
    return val;
  }

  hasNext(): boolean {
    return this.stack.length !== 0;
  }
}

/**
 * Your BSTIterator object will be instantiated and called as such:
 * var obj = new BSTIterator(root)
 * var param_1 = obj.next()
 * var param_2 = obj.hasNext()
 */
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
//   pub val: i32,
//   pub left: Option<Rc<RefCell<TreeNode>>>,
//   pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
//   #[inline]
//   pub fn new(val: i32) -> Self {
//   TreeNode {
//     val,
//     left: None,
//     right: None
//   }
//   }
// }
struct BSTIterator {
  stack: Vec<Option<Rc<RefCell<TreeNode>>>>,
}

use std::rc::Rc;
use std::cell::RefCell;
/**
 * `&self` means the method takes an immutable reference.
 * If you need a mutable reference, change it to `&mut self` instead.
 */
impl BSTIterator {
  fn dfs(
    mut root: Option<Rc<RefCell<TreeNode>>>,
    stack: &mut Vec<Option<Rc<RefCell<TreeNode>>>>
  ) {
    if root.is_some() {
      let left = root.as_mut().unwrap().borrow_mut().left.take();
      stack.push(root);
      Self::dfs(left, stack);
    }
  }

  fn new(root: Option<Rc<RefCell<TreeNode>>>) -> Self {
    let mut stack = vec![];
    Self::dfs(root, &mut stack);
    BSTIterator { stack }
  }

  fn next(&mut self) -> i32 {
    let node = self.stack.pop().unwrap().unwrap();
    let mut node = node.borrow_mut();
    if node.right.is_some() {
      Self::dfs(node.right.take(), &mut self.stack);
    }
    node.val
  }

  fn has_next(&self) -> bool {
    self.stack.len() != 0
  }
}/**
 * Your BSTIterator object will be instantiated and called as such:
 * let obj = BSTIterator::new(root);
 * let ret_1: i32 = obj.next();
 * let ret_2: bool = obj.has_next();
 */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文