思路:
建立一个栈。然后用这个栈记录到当前点路径上的所有点。避免了每次找下一个值要从根节点开始找。。
至于为啥这么想到的,因为题中说你用的最多的空间复杂度是树的深度。所以肯定就是有个记录数深度的东西,那只能是遍历当前节点的所有节点的一个链表了。于是我就想到这个算法了。
至于为啥这个算法是平均上常量时间的。这个问题你可以看看《算法导论》平摊分析的解释。。我这里大约解释一下。就是你到当前节点虽然可能是lg(n)复杂度的。但是,你要取出来路径上那lg(n)个节点就是直接从栈里面取出来,是常量时间的。。所以lg(n)复杂度取出来lg(n)节点。平摊一下,每个节点都是o(1)的了。这个类似于前人栽树后人乘凉的意思。。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class BSTIterator {
private Stack<TreeNode> myStack;
public BSTIterator(TreeNode root) {
myStack=new Stack<TreeNode>();
while(root!=null)
{
myStack.push(root);
root=root.left;
}
}
/** @return whether we have a next smallest number */
public boolean hasNext() {
return !myStack.isEmpty();
}
/** @return the next smallest number */
public int next() {
TreeNode result=myStack.pop();
TreeNode rightTemp=result.right;
while(rightTemp!=null)
{
myStack.push(rightTemp);
rightTemp=rightTemp.left;
}
return result.val;
}
}
本文介绍了一种使用栈优化的二叉搜索树迭代器算法,通过记录路径上的所有点来减少查找时间,实现平均常量时间复杂度。
253

被折叠的 条评论
为什么被折叠?



