173. Binary Search Tree Iterator(二叉查找树迭代器)的C++解法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/musechipin/article/details/84751060

注意是二叉查找树,意味着左子树<根<右子树,因此,如果没有特殊要求,只需要中序遍历树,将每个结点存储即可。

但是题目要求空间复杂度为O(h),h是二叉查找树的深度,因此考虑每次只放一部分树的结点入栈。首先我们知道根的左子树的左子树的左子树...一直到最左的左子树L一定是最小值,那么先把这部分压入栈,栈顶元素L就是最小值。而下一个最小值,有可能是这个结点的右子树(根L->right,或者根的左子树L->right->.....left),那么把这部分压入栈中;如果没有的话就向上找L->father(树的结构里没有这个值但是栈中已经保存了)。
图形解释可以看这篇博客。

class BSTIterator {
public:
    stack<TreeNode *> s;
    BSTIterator(TreeNode *root) {
        while(root!=NULL)
       {
           s.push(root);
           root=root->left;
       }
    }
    bool hasNext() {
        if (s.empty()) return false;
        else return true;
    }
    int next() {
        TreeNode * res=s.top();
        s.pop();
        TreeNode * tmp=res->right;
        while (tmp!=NULL)
        {
            s.push(tmp);
            tmp=tmp->left;
        }
        return res->val;
    }
};
  • 还有要求空间复杂度为O(1)的,我想可以参考Morris算法。Morris算法主要利用了叶子节点的左右子树均为空的特性,构建一个从叶子到根的回路来代替栈。

猜你喜欢

转载自blog.csdn.net/musechipin/article/details/84751060