C / C ++のバイナリツリーの再帰と非再帰トラバーサル

非再帰的なプリオーダートラバーサル:ノードに遭遇し、そのノードと、スタックにプッシュされたノードにアクセスして、その左部分木を横断するドロップします。
スタック・ホルダの上からこのノードをその左の部分木をトラバースし、アドレスに応じて後に右に行くためにそれを連結することによって示される
ノード構造のトラバース右サブツリーを。

非再帰的トラバーサル順序:ノードに遭遇しましたが、それがスタックにプッシュし、その左部分木を横断する置きます。スタックの最上位から、左のサブツリーを横断した後、
ノードおよびアクセスを下支えします。次に、ノードの右サブツリーを横断するために行くために右のアドレスにその指示にリンクをたどります。

ノードに遭遇し、スタックにプッシュし、その左の部分木をトラバース:非再帰的トラバーサルシーケンス後。終わりを通過した後、すぐにアクセスすることはできません
スタックのノード上で、しかし、再び、それはアドレスへの権利のリンクだが、ノードの右部分木を横断する構造で示され
、スタックの最上部を支えるために右のサブツリーを横断した後、アクセスノード。また、スタックプラスの各要素のために必要である
スタックホルダからノードはスタックの左上の差から返されたときに、(右の部分木をトラバースし続けなければならない)ように、フラグ
又は右後方から(そのノードについての周りに旅行してきた)
ノードの左部分木に入った機能を左に戻ってから、残っています。
右のが特徴では、右のサブツリーは、ノードに入った、それは右に戻ってくる表します。

#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