非递归周游二叉树

本文介绍了二叉树的四种遍历方法:前序、中序、后序及层次遍历,并提供了不使用递归的具体实现代码。每种遍历方式都通过栈或队列辅助完成,有助于理解非递归实现的细节。

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

  • 前序周游二叉树
template <class T>
void BinaryTree<T>::PreOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
	using std::stack;
	stack<BinaryTreeNode<T>*> aStack;
	BinaryTreeNode<T>* pointer = root;
	while (!aStack.empty()||pointer) {
		if (pointer) {
			Visit(pointer->value());
			aStack.push(pointer);
			pointer = pointer->leftchiled();
		} else {
			pointer = aStack.top();
			aStack.pop();
			pointer = pointer->rightchild();
		}
	}
}
  • 中序周游二叉树
template <class T>
void BinaryTree<T>::InOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
	using std::stack;
	stack<BinaryTreeNode<T>*> aStack;
	BinaryTreeNode<T>* pointer = root;
	while (!aStack.empty()||pointer) {
		if (pointer) {	
			aStack.push(pointer);
			pointer = pointer->leftchiled();
		} else {
			pointer = aStack.top();
			Visit(pointer->value());		
			pointer = pointer->rightchild();
			aStack.pop();
		}
	}
}

  • 后序周游二叉树
template <class T>
void BinaryTree<T>::PostOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
	using std::stack;
	stack<BinaryTreeNode<T>*> aStack;
	BinaryTreeNode<T>* pointer = root;
	BinaryTreeNode<T>* lastVisite = NULL;
	
	while (!aStack.empty()||pointer) {
		if (pointer) {
			aStack.push(pointer);
			pointer = pointer->leftchiled();
		} else {
			pointer = aStack.top();
			if (pointer->rightchild() == NULL || lastVisite == pointer->rightchild()) {
				Visit(pointer->value());	
				lastVisite = pointer;
				aStack.pop();
				pointer = NULL;
			} else
				pointer = pointer->rightchild();
		}
	}
}


  • 层次周游二叉树
template <class T>
void BinaryTree<T>::PostOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
	using std::queue;
	queue<BinaryTreeNode<T>*> aQueue;
	BinaryTreeNode<T>* pointer = root;
	if (pointer)
		aQueue.push(pointer);
	while(!aQueue.empty()) {
		pointer = aQueue.front();
		Visit(pointer->value());	
		aQueue.pop();
		if (pointer->->leftchiled())
			aQueue.push(pointer->->leftchiled());
		if (pointer = pointer->rightchild())
			aQueue.push(pointer = pointer->rightchild());
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值