173. 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器:
BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。
 
boolean hasNext() 如果向指针右侧遍历存在数字,则返回 true ;否则返回 false 。
 
int next()将指针向右移动,然后返回指针处的数字。
 
 
注意,指针初始化为一个不存在于 BST 中的数字,所以对 next() 的首次调用将返回 BST 中的最小元素。
你可以假设 next() 调用总是有效的,也就是说,当调用 next() 时,BST 的中序遍历中至少存在一个下一个数字。
链接 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 var  BSTIterator  = function (root ) {  this .first  = null    this .end  = false    this .initData (root) }; BSTIterator .prototype  .initData  = function (root ) {  if  (root === null ) return    root.right  && (root.right .parent  = root)   this .initData (root.right )   root.left  && (root.left .parent  = root)   this .first  = root   this .initData (root.left ) }; BSTIterator .prototype  .next  = function ( ) {  let  res = this .first    this .first .isReaded  = true    if  (this .first .right ) {     let  right = this .first .right      while (right) {       this .first  = right       right = right.left      }   } else  {     let  parent = this .first .parent      if  (parent && !this .end ) {       while (parent.parent  && parent.isReaded ) {         parent = parent.parent        }       if  (parent.isReaded ) {         this .end  = true        } else  {         this .first  = parent       }     }   }   return  res.val  }; BSTIterator .prototype  .hasNext  = function ( ) {  return  !this .first .isReaded  }; 
 
栈堆解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 var  BSTIterator  = function (root ) {  this .stack  = []   this .cur  = root }; 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  };