C/C++ 二叉树的递归与非递归遍历

非递归前序遍历:遇到一个节点,就访问该节点,并把节点推入栈中,然后下降去遍历它的左子树。
遍历完它的左子树后,从栈顶托出这个节点,并按照它的右链接指示的地址再去
遍历该节点的右子树结构。

非递归中序遍历:遇到一个节点,就把它推入栈中,并去遍历它的左子树。遍历完左子树后,从栈顶
托出这个节点并访问。然后按照它的右链接指示的地址再去遍历该节点的右子树。

非递归后序遍历:遇到一个节点,把它推入栈中,遍历它的左子树。遍历结束后,还不能马上访问
处于栈顶的该节点,而是要再按照它的右链接结构指示的地址去遍历该节点的右子树,
遍历完右子树后才能从栈顶托出该节点并访问。另外,需要给栈中的每个元素加上一个
特征位,以便当从栈顶托出一个节点时区别是从栈顶元素左边回来的(则要继续遍历右子树),
还是从右边回来的(该节点的左右节点均已周游)
特征为left表示已进入该节点的左子树,将从左边回来。
特征为right表示已进入该节点的右子树,将从右边回来。

#include <iostream>
#include <string>
#include <stack>
#include <vector>
using namespace std;
struct Node
{
	int val;
	Node* left;
	Node* right;
	Node(int x):val(x),left(nullptr),right(nullptr){};
};

void createBiTree(Node* &root)
{
	int x;
	cin>>x;
	if (x==-1)
	{
		root = nullptr;
		return;
	}
	root = new Node(x);
	createBiTree(root->left);
	createBiTree(root->right);
}

void visit(Node* T)
{
	if (T->val!=-1) 
		cout<<T<<val<<"  "; 
}

//递归方式遍历
//先序递归遍历
void preOrder(Node* root)
{
	if(root!=nullptr)
	{
		visit(root);
		preOrder(root->left);
		preOrder(root->right);
	}
}

//中序递归遍历
void inOrder(Node* root)
{
	if(root!=nullptr)
	{
		inOrder(root->left);
		visit(root);
		inOrder(root->right);
	}
}

//后序递归遍历
void postOrder(Node* root)
{
	if(root!=nullptr)
	{
		postOrder(root->left);
		postOrder(root->right);
		visit(root);
	}
}

//非递归方式遍历
//先序遍历
void preOrderF(Node* root)
{
	if (root==nullptr)
		return;
	stack<Node*> s;
	s.push(root);
	Node* p = nullptr;
	while(!s.empty())
	{
		p.s.top();
		s.pop();
		cout<<p->val<< "  ";
		if (p->right)
			s.push(p->right);
		if(p->left)
			s.push(p->left);
	}
}

//中序遍历
void inOredrF(Node* root)
{
	if(root == nullptr)
		return;
	stack<Node*> s;
	Node* p = root;
	while(p||!s.empty())
	{
		if(p)
		{
			s.push(p);
			p = p->left;
		}
		else
		{
			p = s.top();
			s.pop();
			cout<<p->val<<"  ";
			p = p->right;
		}
	}
}

//后序遍历
void postOrderF(Node* root)
{
	if(root == nullptr)
		return;
	stack<Node*> s;
	std::vector<int> rs;
	s.push(root);
	Node* p = nullptr;
	while(!s.empty())
	{
		p = s.top();
		s.pop();
		rs.insert(rs.begin(),p->val);
		if(p->left)
			s.push(p->left);
		if(p->right)
			s.push(p->right);
	}
	for(int i = 0;i<rs.size();i++)
		cout<<rs[i]<< "  ";
}

int main()
{
	Node* root;
	createBiTree(root);
	preOrderF(root);
	cout<<endl;
	inOredrF(root);
	cout<<endl;
	postOrderF(root);
	cout<<endl;

	system("pause");
	return 0;
}
发布了43 篇原创文章 · 获赞 1 · 访问量 2318

猜你喜欢

转载自blog.csdn.net/lpl312905509/article/details/102624998