多叉树的前序遍历_基于顺序存储实现的多叉树(3):前序遍历

本文介绍了基于顺序存储的多叉树实现,特别是前序遍历的迭代器设计,包括只读、读写、只读反转和读写反转四种类型。通过非递归的迭代回溯方法避免了递归带来的栈空间问题。文章详细阐述了迭代器的实现,包括`forward_first`、`forward_last`、`forward_next`和`forward_prev`等关键方法,以及如何通过标签分发实现迭代器的正向和反向遍历。此外,还提供了正向和反向遍历整棵树的示例代码。
摘要由CSDN通过智能技术生成

类型定义在多叉树中,前序遍历迭代器有只读、读写、只读反转、读写反转4种,在mtree容器中的定义如下:

1

        typedef pre_iterator_implpre_iterator;2typedef pre_iterator_implreverse_pre_iterator;3typedef pre_iterator_implconst_pre_iterator;4typedef pre_iterator_implconst_reverse_pre_iterator;

这4种类型定义,都是作为mtree模板类的公开成员,由于第2个参数决定了是否反转这个信息是在编译期决定,因此提供了反转迭代器特性模板类以作为标签分发来实现重载调用,其它各种迭代器也是一样,并在tree命名空间内而不作为mtree模板类的成员,其定义如下:

1

    structreverse_tag{};2

structno_reverse_tag{};34    template5structreverse_trait;67    template<>8structreverse_trait9

{10        typedef reverse_tag type;11    };12    template<>13structreverse_trait14

{15        typedef no_reverse_tag type;16    };

接口定义   对于二叉树的前序遍历,我们都很熟悉,类似地,多叉树的前序遍历与二叉树一样:先访问根结点,再访问它的左子树(若存在),然后访问它的右子树(若存在),递归地,每颗子树内部结点的访问顺序都遵循着上面的规律。在这里设计上,由于树结点相对普通二叉树的结点结构增加了一个父结点偏移量域,因此是基于迭代回溯而非递归的方法来实现各种遍历的,这样就避免了递归实现带来的栈空间问题,而每种遍历都被设计为一种对应的迭代器来实现,多叉树容器只需提供各种遍历迭代器作为公共接口供外部使用,就可实现树的遍历。实现每种迭代器,关键是实现其前置递增(对应operator++)、前置递减方法(对应operator--),其它方法都可在此基础上实现。下面代码是前序遍历迭代器的声明:

1

        template2classpre_iterator_impl :publiciterator_base_impl3

{4friendclassmtree;5typedef iterator_base_implbase_type;6typedef typename base_type::node_pointer_type node_pointer_type;7typedef typename base_type::tree_pointer_type tree_pointer_type;8usingbase_type::tree_;9usingbase_type::off_;10usingbase_type::root_;11usingbase_type::skip_progeny_;12public:13pre_iterator_impl();14pre_iterator_impl(constbase_type&iter);15pre_iterator_impl&operator++();16pre_iterator_impl&operator--();17pre_iterator_imploperator++(int);18pre_iterator_imploperator--(int);19pre_iterator_imploperator+(size_t off);20pre_iterator_impl&operator+=(size_t off);21pre_iterator_imploperator-(size_t off);22pre

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值