本文基于二叉树的实现中类似的二叉树结构,其要求节点结构只有左右孩子而无父节点的二叉树。
因此,只能靠队列/栈来存储遍历的路径信息,模拟递归调用的过程。同时,本文中迭代器的判断operator==/!=只能通过判断队列/栈中的路径信息来实现。
严格地讲,本文的迭代器不如叫作伴随类。因为它不够轻量,一般的迭代器只保存指针信息,而本文的迭代器使用了队列/栈。其中,前序、中序、后序迭代器的栈最大为O(height),因为它们是不断向下遍历的。而层次遍历迭代器因为是层次遍历 因此队列最大为O(每一层的最大个数),其理论系数为2(2层)。
前序遍历迭代器
#pragma once
#ifndef BINARYTREEITER_H
#define BINARYTREEITER_H
#include <iterator>
#include "binaryTreeNode.h"
#include "..//..//..//ch08/Stack/Stack/stackArray.h"
#include "..//..//..//ch09/Queue/Queue/queueArray.h"
//=============================前序迭代器=============================
template <typename T>
class preIter:public std::iterator<
std::forward_iterator_tag, //iterator_category 单向迭代器
T, //type_value
long, //differenece_type
T*, //pointer
T&> //reference
{
public:
//构造函数
explicit preIter(binaryTreeNode<T>* _ptr = nullptr) :nodePtr(_ptr) {
nodeStack.push(nullptr);//作为遍历结束的标志
};
//解引用
T& operator*()const {
return nodePtr->element; }
T* operator->()const {
return &nodePtr->element; }
//递增
preIter& operator++() {
if (!nodeStack.empty() || nodePtr != nullptr) {
//未遍历完
if (nodePtr->rightChild != nullptr)//如果存在右孩子
nodeStack.push(nodePtr->rightChild);
if (nodePtr->leftChild != nullptr)//如果存在左孩子
nodePtr = nodePtr->leftChild;
else {
//否则回退
nodePtr = nodeStack.top();
nodeStack.pop();
}
}
return *this;
}
preIter operator++(int) {
preIter ret = *this;
++* this;
return ret;
}
//相等
bool operator==(const preIter& rhs) {
if (nodePtr == nullptr || rhs.nodePtr == nullptr) {
if (nodePtr == nullptr && rhs.nodePtr == nullptr)//两个都等于空
return true;
else
return false;//其中一个为空
}
//首先判断当前节点元素是否相等
if (nodePtr