中序历遍
我们希望以升序的方式历遍二叉树,这种历遍方式就是中序历遍,好了,那看看中序历遍的非递归实现:
可以想到,将中序历遍分成两部分,初始化阶段,以及迭代阶段。先看看初始化阶段:
还有,迭代阶段:
迭代器设计
二叉树的迭代器是 input iterator,可以这样设计:
你可能觉得奇怪,为什么有一个成员变量index
,考虑一下,我们要怎样比较两个迭代器相等?
比较两个栈是否相等的开销比较大,使用index
表示元素的编号,我们可以将其改成这样:
接着看看构造函数,end
为true
的时候,表示我们创建的是由end()
返回的迭代器:
可以这样创建迭代器:
迭代器的操作:
自增操作
首先,看一下自增操作符:
使用后缀自增形式时,编译器会自动传递参数 0 给它:
为什么后缀自增需要返回一个 const 的 const_iterator 呢?让我们看看基本类型后缀自增:
如果后缀自增返回的不是 const 的 const_iterator,那么,下面的操作就是合法的:
这种连续的后缀自增操作十分混淆,比如说iter++
返回一个临时对象,接着对这个临时对象执行后缀自增操作,但实际上iter
只增加了一次。所以我们让后缀自增返回一个 const 对象,以禁止iter++++
这种操作。
来看看自增操作的实现:
完整的代码: