力扣面试150(67/150)

发布于:2025-09-01 ⋅ 阅读:(15) ⋅ 点赞:(0)

8.29 173. 二叉搜索树迭代器

实现一个二叉搜索树迭代器类

BSTIterator

,表示一个按中序遍历二叉搜索树(BST)的迭代器:

  • BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
  • boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false
  • int next()将指针向右移动,然后返回指针处的数字。

注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。

你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。

我的思路:

我们先对树进行中序遍历得到一个中序遍历的数组,然后利用数组的api进行解答即可

我的代码:

/**
 * 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.arr = [];
    this.inorderSort(root , this.arr);
    return null;
};
// 中序遍历放在数组当中
BSTIterator.prototype.inorderSort = function(root , arr){
    if(!root)return ;
    this.inorderSort(root.left , arr);
    arr.push(root.val);
    this.inorderSort(root.right , arr);
}
// 中序遍历:左->中->右
/**
 * @return {number}
 */
BSTIterator.prototype.next = function() {
    return this.arr.shift();
    
};

/**
 * @return {boolean}
 */
BSTIterator.prototype.hasNext = function() {
    return this.arr.length === 0 ? false : true;
    
};

/** 
 * 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()
 */

总结:这段代码实现了一个二叉搜索树的迭代器,其核心策略是“预计算”。在初始化时,它会通过一次完整的中序遍历,将树中所有节点的值按从小到大的顺序存入一个内部数组。这样一来,后续的 next() 和 hasNext() 操作就变得非常简单,它们只是对这个已排序的数组进行读取和判断。这种方法的优点是逻辑清晰,且 next() 和 hasNext() 操作本身非常高效。


网站公告

今日签到

点亮在社区的每一天
去签到