基于二叉树的前序、中序、后序以及层次遍历迭代器

本文介绍了如何基于二叉树结构,实现前序、中序、后序和层次遍历的迭代器。迭代器利用队列或栈模拟递归调用,由于节点没有父节点,所以需要额外存储路径信息。前序、中序、后序迭代器的栈空间复杂度为O(height),层次遍历迭代器的队列空间复杂度与二叉树最宽层数相关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文基于二叉树的实现中类似的二叉树结构,其要求节点结构只有左右孩子而无父节点的二叉树。


因此,只能靠队列/栈来存储遍历的路径信息,模拟递归调用的过程。同时,本文中迭代器的判断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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值