二叉树递归和非递归遍历

本文介绍了二叉树的两种遍历方式:递归遍历和非递归遍历。详细阐述了遍历的原理,并提供了相应的源码实现,帮助读者理解二叉树的遍历操作。

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

二叉树递归和非递归遍历

在这里插入图片描述
源码:

#include<queue>
#include<stack>
#include<vector>
#include<iostream>
using namespace std;
//假设空节点的值为-1
//const int arrrlens = 18;
//char arr[arrrlens] = { 'A', 'B', 'D' , '#', 'H', '#', '#', 'E', '#', '#',\
           'C', 'F' , '#', '#', 'G', '#', '#'};
//A B D # H # # E # # C F # # G # #
class Node {
public:

	Node(int el = 0, Node * l = NULL, Node * r = NULL) {
		data = el;
		mark = 0;
		left = l;
		right = r;
	}
	char data;
	int mark;
	Node* left, * right;
};
class Tree {
public:

	Tree() { root = NULL; }
	~Tree() { delete root; }
	int create(Node* &);
	int preOrder();
	int infxOrder();
	int postOrder();
	int print_preOrder(Node*);
	int print_infixOrder(Node*);
	int print_postOrder(Node*);
public:
	Node* root;
};
int Tree::print_preOrder(Node* root)
{
	//递归先序遍历
	if (root != NULL)
	{
		cout << root->data << " ";
		print_preOrder(root->left);
		print_preOrder(root->right);
	}
	return 0;
}
int Tree::print_infixOrder(Node* root)
{
	//递归中序遍历
	if (root != NULL)
	{
		print_infixOrder(root->left);
		cout << root->data << " ";
		print_infixOrder(root->right);
	}
	return 0;
}
int Tree::print_postOrder(Node* root)
{
	//递归后序遍历
	if (root != NULL)
	{
		print_postOrder(root->left);
		print_postOrder(root->right);
		cout << root->data << " ";
	}
	return 0;
}
int Tree::preOrder()
{
	/*先序遍历,采用非递归的方法*/
	cout << endl << "先序遍历,采用非递归的方法" << endl;
	Node* p = root;
	stack<Node*> S;
	while (p != NULL || !S.empty())
	{
		if (p != NULL)
		{ 
			cout << p->data << " ";
			S.push(p);
			p = p->left;
		}
		else
		{
			p = S.top();
			S.pop();
			p = p->right;
		}
	}
	return 0;
}
int Tree::infxOrder()
{
	/*中序遍历,采用非递归的方法*/
	cout << endl << "中序遍历,采用非递归的方法" << endl;
	Node* p = root;
	stack<Node*> S;
	while (p != NULL || !S.empty())
	{
		if (p != NULL)
		{ 
			S.push(p);
			p = p->left;
		}
		else {
			p = S.top();
			S.pop();
			cout << p->data << " ";
			p = p->right;
		}
	}
	return 0;
}
int Tree::postOrder()
{
	/*后序遍历,采用非递归的方法*/
	cout << endl << "后序遍历,采用非递归的方法" << endl;
	Node* p = root;
	vector<Node*> S;
	vector<char> res;
	while (p != NULL || !S.empty())
	{
		if (p != NULL)
		{
			S.push_back(p);
			res.push_back(p->data);
			p = p->right;
		}
		else
		{
			p = S.back();
			S.pop_back();
			p = p->left;
		}
	}
	reverse(res.begin(), res.end());
	vector<char>::iterator ite = res.begin();
	for (; ite != res.end(); ite++) {
		cout << *ite <<" ";
	}
	cout << endl;
	return 0;
}
int Tree::create(Node*& root)
{
	// input: A B D # H # # E # # C F # # G # #
	char val;
	cin >> val;
	if (val != '#')
	{
		root = new Node(val);
		create(root->left);
		create(root->right);
	}
	else
		root = NULL;
	return 0;
}
int main()
{
	Tree tree;
	//intpu: A B D # H # # E # # C F # # G # #
	tree.create(tree.root);
	cout << " 递归先序遍历" << endl;
	tree.print_preOrder(tree.root);
	cout << endl << " 递归中序遍历" << endl;
	tree.print_infixOrder(tree.root);
	cout << endl << " 递归后序遍历" << endl;
	tree.print_postOrder(tree.root);
	tree.preOrder();
	tree.infxOrder();
	tree.postOrder();
	return 0;
}

结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值