原题:
完成一个二叉搜索树的迭代器。里面的next()方法会返回下一个最小的值。hasNext()返回是否还有下一个。要求它们的时间复杂度平均O(1),空间复杂的O(h)。h是树的高度。
思考过程:
一开始想的是用中序遍历二叉搜索树得到结果就是所有值从小到大排列。把它们存到队列里,每次调用next()就出队列,很方便。没有去实现,因为觉得这样空间复杂度就超了。只好用不太熟悉的非递归方法中序遍历二叉搜索树了。
解题思路:
详情看代码注释。注意
addTreeNodeIntoStack(TreeNode treeNode){//把输入节点的所有左节点以及左节点的左节点.....放入栈中。
public TreeNode treeNode; public Stack<TreeNode> stack = new Stack<>(); public BSTIterator(TreeNode root) { addTreeNodeIntoStack(root);//依次把root和root左节点以及左节点的左节点......放入栈中 } /** @return whether we have a next smallest number */ public boolean hasNext() { return (treeNode != null || !stack.isEmpty()); } /** @return the next smallest number */ public int next() { int ret; if (treeNode == null) treeNode = stack.pop(); ret = treeNode.val; treeNode= treeNode.right;//每次把treeNode值存到ret后treeNode都变成自己的右节点,然后对右节点进行addTreeNodeIntoStack addTreeNodeIntoStack(treeNode); return ret; } public void addTreeNodeIntoStack(TreeNode treeNode){//把输入节点的所有左节点以及左节点的左节点.....放入栈中。 while (treeNode != null){ stack.push(treeNode); treeNode = treeNode.left; } if (!stack.empty())this.treeNode = stack.pop();//最后一个出栈,用treeNode标记 } } /** * Your BSTIterator will be called like this: * BSTIterator i = new BSTIterator(root); * while (i.hasNext()) v