86. Binary Search Tree Iterator

遍历二查找叉树

LintCode链接

题目描述

设计一个迭代器,该迭代器可以按照以下要求一棵二叉查找树
- 遍历的顺序按照从小到大的排序规则
- next与hasNext的时间复杂度平均为O(1)

样例

对于下面的二叉树,使用迭代器遍历将按照如下顺序遍历:[1, 6, 10, 11, 12]

   10
 /    \
1      11
 \       \
  6       12

思路

首先需要理解二叉查找树的概念:所有左节点的元素都比当前元素小,所有右节点的元素都比当前元素大。
遍历方式很简单,数据结构课程上都写过,唯一需要注意的是,题目定义的TreeNode没有存储parent变量,所以需要使用一个stack来存储当前的遍历层级,这样可以快速的找到父节点。内存复杂度为O(h),h为树的高度,时间复杂为平均为O(1)

代码

class BSTIterator {
public:
    /*
    * @param root: The root of binary tree.
    */
    stack<TreeNode*> _node;
    BSTIterator(TreeNode * root) {
        push(root);
    }

    void push(TreeNode *node)
    {
        while (node)
        {
            _node.push(node);
            node = node->left;
        }
    }

    /*
    * @return: True if there has next node, or false
    */
    bool hasNext() {
        // write your code here
        return _node.empty() == false;
    }

    /*
    * @return: return next node
    */
    TreeNode * next() {
        // write your code here
        if (_node.empty())
        {
            return NULL;
        }
        TreeNode* ret = _node.top();
        _node.pop();
        push(ret->right);
        return ret;
    }
};

后记

查了下资料,stl中的map使用类似思路,但是为了迭代器在插入元素与删除元素后不会失效,节点会存储parent,不适用辅助的stack变量,所以内存复杂度为O(1),时间复杂度平均值也为O(1),可以看到map迭代遍历的方式会有一个遍历找下一个节点的开销,开销最大为O(logN),所以综合效率肯定没有顺序容器的快

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值