/* 思路:根据题意,在调用next()的时候我们需要按照二叉搜索树的中序遍历顺序返回结果,所以可以先对BST进行中序遍历,然后把遍历的结果 储存到this.nodeVals中,再维护一个this.idx 来表示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 */ const BSTIterator = function (root) { this.arr = []; // 二叉搜索树中序遍历结果 this.idx = 0; // 调用next返回得值 BSTIterator.inOrderTravers(root, this.arr); // 把中序遍历结果存入this.arr }; /** * @return {number} */ BSTIterator.prototype.next = function () { return this.arr[this.idx++]; }; /** * @return {boolean} */ BSTIterator.prototype.hasNext = function () { // 如果this.idx 小于this.arr.lengthz则表示,调用next能获取下一个元素 return this.idx < this.arr.length; }; BSTIterator.inOrderTravers = function (root, arr) { if (!root) return; // 处理左子树 BSTIterator.inOrderTravers(root.left, arr); // 将值存入数组中 arr.push(root.val); // 处理右子树 BSTIterator.inOrderTravers(root.right, arr); }; /** * 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应该打印得值 */ // var BSTIterator = function(root) { // this.cur = root; // this.stack = []; // }; // BSTIterator.prototype.next = function() { // while (this.cur) { // this.stack.push(this.cur); // this.cur = this.cur.left; // } // this.cur = this.stack.pop(); // const ret = this.cur.val; // this.cur = this.cur.right; // return ret; // }; // BSTIterator.prototype.hasNext = function() { // return this.cur !== null || this.stack.length; // };