LintCode_二叉查找树迭代器

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

设计实现一个带有下列属性的二叉查找树的迭代器:

  • 元素按照递增的顺序被访问(比如中序遍历)
  • next()hasNext()的询问操作要求均摊时间复杂度是O(1)
样例

对于下列二叉查找树,使用迭代器进行中序遍历的结果为 [1, 6, 10, 11, 12]

   10
 /    \
1      11
 \       \
  6       12
思路就是引入一个辅助栈。在遍历的过程中利用辅助栈逆序地记录和保存沿途经过的各个节点,以便确定自底而上各段遍历子序列最终在宏观上的拼接次序。
/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 * Example of iterate a tree:
 * BSTIterator iterator = BSTIterator(root);
 * while (iterator.hasNext()) {
 *    TreeNode * node = iterator.next();
 *    do something for node
 */
class BSTIterator {
public:
    //@param root: The root of binary tree.
    BSTIterator(TreeNode *root) {
        curr=nullptr;
        //持续深入左子树
        while(root)
        {
            S.push(root);
            root=root->left;
        }
    }

    //@return: True if there has next node, or false
    bool hasNext() {
        return (S.empty()?false:true);
    }

    //@return: return next node
    TreeNode* next() {
        if (S.empty())  
        {  
            return NULL;  
        }  
        TreeNode *top = S.top(); S.pop(); //先把下一个节点拿出来
        if (top->right)  //如果该节点有右子树,则还要处理子树的点
        {  
            TreeNode *cur = top->right; 
            while (cur)  
            {  
                S.push(cur);  //推入栈中去,此时S.front就是下一个结点
                cur = cur->left;  
            }  
        }  
  
        return top; 
    }
private:
    TreeNode* curr;
    stack<TreeNode*> S;
};


阅读更多

没有更多推荐了,返回首页