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() 操作本身非常高效。