1. 程式人生 > >二叉樹遍歷(C++實現)

二叉樹遍歷(C++實現)

二叉樹3種深度優先遍歷(遞迴、非遞迴)、層次遍歷,最簡潔、最好記!

#include<iostream>
#include<stack>
#include<queue>

using namespace std;
//節點定義
struct Node
{
	char data;
	Node *left;
	Node *right;

	Node(const char &Data, Node *Left = NULL, Node *Right = NULL)
	{
		data = Data;
		left = Left;
		right = Right;
	}
};
//先序遍歷(遞迴)
void pre_order_recursive(Node *root)
{
	if (root == NULL)
		return;
	cout << root->data << " ";
	pre_order_recursive(root->left);
	pre_order_recursive(root->right);
}
//中序遍歷(遞迴)
void mid_order_recursive(Node *root)
{
	if (root == NULL)
		return;
	mid_order_recursive(root->left);
	cout << root->data << " ";
	mid_order_recursive(root->right);
}
//後序遍歷(遞迴)
void post_order_recursive(Node *root)
{
	if (root == NULL)
		return;
	post_order_recursive(root->left);
	post_order_recursive(root->right);
	cout << root->data << " ";
}
//先序遍歷
void pre_order(Node *root)
{
	if (root == NULL)
		return;
	stack<Node*> s;
	s.push(root);
	Node *p = NULL;
	while (!s.empty())
	{
		p = s.top();
		cout << p->data << " ";
		s.pop();
		if (p->right)
			s.push(p->right);
		if (p->left)
			s.push(p->left);
	}
}
//中序遍歷
void mid_order(Node *root)
{
	if (root == NULL)
		return;
	stack<Node*> s;
	Node *p = root;
	while (p != NULL || !s.empty())
	{
		while (p != NULL)
		{
			s.push(p);
			p = p->left;
		}
		p = s.top();
		cout << p->data << " ";
		s.pop();
		p = p->right;
	}
}
//後序遍歷
void post_order(Node *root)
{
	if (root == NULL)
		return;
	stack<Node*> s;
	Node *p = root, *r = NULL;
	while (p != NULL || !s.empty())
	{
		while (p != NULL)
		{
			s.push(p);
			p = p->left;
		}
		p = s.top();
		if (p->right&&p->right != r)
		{
			p = p->right;
		}
		else
		{
			cout << p->data << " ";
			s.pop();
			r = p;
			p = NULL;
		}
	}
}
//層次遍歷
void layer_order(Node *root)
{
	if (root == NULL)
		return;
	queue<Node*> q;
	q.push(root);
	Node *p = NULL;
	while (!q.empty())
	{
		p = q.front();
		cout << p->data << " ";
		q.pop();
		if (p->left)
			q.push(p->left);
		if (p->right)
			q.push(p->right);
	}
}

void main()
{
	Node *A = new Node('A');
	Node *B = new Node('B');
	Node *C = new Node('C');
	Node *D = new Node('D');
	Node *E = new Node('E');

	A->left = B;
	A->right = C;
	B->right = D;
	D->left = E;

	cout << "先序遍歷-遞迴:";
	pre_order_recursive(A);
	cout << endl;

	cout << "中序遍歷-遞迴:";
	mid_order_recursive(A);
	cout << endl;

	cout << "後序遍歷-遞迴:";
	post_order_recursive(A);
	cout << endl;

	cout << "先序遍歷-非遞迴:";
	pre_order(A);
	cout << endl;

	cout << "中序遍歷-非遞迴:";
	mid_order(A);
	cout << endl;

	cout << "後序遍歷-非遞迴:";
	post_order(A);
	cout << endl;

	cout << "層次遍歷:";
	layer_order(A);
	cout << endl;

	delete A; delete B; delete C; delete D; delete E;
	getchar();
	return;
}

 二叉樹:

 輸出: