二叉树非递归前序,中序,后序,层次遍历

本文提供了一段C++代码,实现了二叉树的层次遍历、前序遍历、中序遍历和后序遍历。通过递归和非递归方法展示了不同遍历方式的实现,适用于数据结构与算法的学习。

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

这个说明网上非常多,就直接上代码了。


#include <iostream>
#include <vector>
#include <deque>
#include <stack>
using namespace std;

struct BinaryTreeNode
{
	int value;
	BinaryTreeNode * left;
	BinaryTreeNode * right;
};

//增加节点
void addNode(BinaryTreeNode *& node, int value)
{
	if(NULL == node)
	{
		node = new BinaryTreeNode;
		node->value = value;
		node->left = NULL;
		node->right = NULL;
		//cout<< node->value<<" ";
	}
	if(node->value > value)
		addNode(node->left, value);
	if(node->value < value)
		addNode(node->right, value);
	if(node->value == value)
		return;
}


//层次遍历
void PrintFromTopToButtom(BinaryTreeNode* root)
{
	cout<<"层次遍历:";
	if(!root)
		return;
	deque<BinaryTreeNode*> queue;
	queue.push_back(root);
	while(queue.size())
	{
		BinaryTreeNode* temp = queue.front();
		queue.pop_front();
		cout<<temp->value<<" ";
		if(temp->left)
			queue.push_back(temp->left);
		if(temp->right)
			queue.push_back(temp->right);
	}
	cout<<endl;
}
//非递归前序遍历实现
void preorderTree(BinaryTreeNode* root)
{
	cout<<"前序遍历:";
	//BinaryTreeNode* node;
	if(!root)
		return;
	stack<BinaryTreeNode*> mystack;
	//mystack.push(root);
	while(!mystack.empty() || root)
	{
		while(root)
		{
			cout<<root->value<<" ";
			mystack.push(root);
			root = root->left;
		}
		root = mystack.top();
		mystack.pop();
		root = root->right;
	}
	cout<<endl;
}

//非递归中序遍历
void inorderTree(BinaryTreeNode* root)
{
	cout<<"中序遍历:";
	if(!root)
		return;
	stack<BinaryTreeNode*> mystack;
	while(root || !mystack.empty())
	{
		while(root)
		{
			mystack.push(root);
			root = root->left;
		}
		root = mystack.top();
		mystack.pop();
		cout<<root->value<<" ";
		root = root->right;
	}
	cout<<endl;
}

//非递归后序遍历
void postorderTree(BinaryTreeNode* root)
{
	cout<<"后序遍历:";
	if(!root)
		return;
	stack<BinaryTreeNode*> mystack;
	stack<int> tag;
	while(!mystack.empty() || root)
	{
		while(root)
		{
			mystack.push(root);
			tag.push(0);
			root = root->left;
		}
		while(!tag.empty() && tag.top() == 1)//前一个条件主要是判断只剩根节点后的情况
		{
			root = mystack.top();
			cout<<root->value<<" ";
			tag.pop();
			mystack.pop();
		}
		if(!mystack.empty())
		{
			root = mystack.top();
			tag.pop();
			tag.push(1);
			root = root->right;
		}
		else
			root = NULL;
	}
	cout<<endl;
}

int main()
{
	BinaryTreeNode* root = NULL;
	addNode(root, 10);
	addNode(root, 5);
	addNode(root, 12);
	addNode(root, 4);
	addNode(root, 7);
	addNode(root, 24);
	PrintFromTopToButtom(root);
	preorderTree(root);
	inorderTree(root);
	postorderTree(root);
	getchar();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值