神は学習アルゴリズムと一緒に左(非再帰的なバイナリツリートラバーサル)

先行順走査:
ここに画像を挿入説明

void xianxubianli(TreeNode*& tree)
{
	if (tree == nullptr)
		return;
	stack<TreeNode*> sta;
	sta.push(tree);
	while (!sta.empty())
	{
		tree = sta.top();
		sta.pop();
		cout << tree->value << " ";
		if (tree->right != nullptr)
			sta.push(tree->right);
		if (tree->left != nullptr)
			sta.push(tree->left);
	}
}

:非再帰的トラバーサル順前に
スタックを使用して:
1.ツリーは直接戻り、空のときに空である
ノード2所与のツリーは、スタック押圧
スタックが空でない場合には3を、第一のポップアップとの接合を印刷しますポイントは、このノードの右側に、左ノードを順次スタックにプッシュされた場合の空でない、スタックまでのサイクルアップが空であります

================================================== ==================================

予約限定:

#include<iostream>
#include<stack>
using namespace std;
template<class T>
struct TreeNode
{
	TreeNode(int c = 0)
	:value(c)
	, left(nullptr)
	, right(nullptr)
	{}
	TreeNode<T>* left;
	TreeNode<T>* right;
	T value;
};
template<class T>
void 中序遍历(TreeNode<T>*& tree)
{
	if (tree != nullptr)
	{
		stack<TreeNode<T>*> sta;
		while (!sta.empty() || tree != nullptr)
		{
			if (tree != nullptr)
			{
				sta.push(tree);
				tree = tree->left;
			}
			else
			{
				tree = sta.top();
				sta.pop();
				cout << tree->value << " ";
				tree = tree->right;
			}
		}
	}
}
int main()
{
	TreeNode<int>* tree = new TreeNode<int>;
	TreeNode<int>* right1 = new TreeNode<int>(1);
	TreeNode<int>* left1 = new TreeNode<int>(2);
	TreeNode<int>* right2 = new TreeNode<int>(3);
	TreeNode<int>* left2 = new TreeNode<int>(4);
	TreeNode<int>* right3 = new TreeNode<int>(5);
	TreeNode<int>* left3 = new TreeNode<int>(6);
	tree->left = left1;
	tree->right = right1;
	left1->left = left2;
	left1->right = right2;
	right1->left = left3;
	right1->right = right3;
	中序遍历(tree);
	return 0;
}

ここに画像を挿入説明
結果:
ここに画像を挿入説明
スタックが空または現在のノードが空で、サイクルされていないではない場合は1が
空にされていない現在のノード2.は、スタックは常に、左ノードに押されます
、現在のノードで3空であります場合先頭要素をポップし、ポップアップノードと右のノードが空でない場合には、右ノードに押し込まれる
スタックが空である、木の端部が空サイクルになるまで4
ポップアップ印刷即ち

================================================== =================================
後順コード:

#include<iostream>
#include<stack>
using namespace std;
template<class T>
struct TreeNode
{
	TreeNode(int c = 0)
	:value(c)
	, left(nullptr)
	, right(nullptr)
	{}
	TreeNode<T>* left;
	TreeNode<T>* right;
	T value;
};
template<class T>
void 后序遍历(TreeNode<T>*& tree)
{
	if (tree == nullptr)
		return;
	stack<TreeNode<T>*> sta;
	stack<TreeNode<T>*> sta1;
	sta.push(tree);
	while (!sta.empty())
	{
		tree = sta.top();
		sta.pop();
		sta1.push(tree);
		if (tree->left != nullptr)
			sta.push(tree->left);
		if (tree->right != nullptr)
			sta.push(tree->right);
	}
	while (!sta1.empty())
	{
		cout << sta1.top()->value<<" ";
		sta1.pop();
	}
}
int main()
{
	TreeNode<int>* tree = new TreeNode<int>;
	TreeNode<int>* right1 = new TreeNode<int>(1);
	TreeNode<int>* left1 = new TreeNode<int>(2);
	TreeNode<int>* right2 = new TreeNode<int>(3);
	TreeNode<int>* left2 = new TreeNode<int>(4);
	TreeNode<int>* right3 = new TreeNode<int>(5);
	TreeNode<int>* left3 = new TreeNode<int>(6);
	tree->left = left1;
	tree->right = right1;
	left1->left = left2;
	left1->right = right2;
	right1->left = left3;
	right1->right = right3;
	后序遍历(tree);
	return 0;
}

ここに画像を挿入説明
ここに画像を挿入説明
後順トラバーサルはのプリアンブルにプッシュされます
ここに画像を挿入説明

バイナリツリートラバーサルのために:時間複雑度はノードの数であり、空間的複雑さは、(なぜならプレスポップ定数の、木のすなわち最大高さ)ツリーの高さであります

機能スタック、非再帰的なバージョンへのあなたのためのオペレーティングシステムの再帰バージョン追加のスペースで、自分のスタックを提供することである
にもO(1)に圧縮されたバイナリツリー、スペースの複雑さをトラバースする方法

公開された230元の記事 ウォン称賛28 ビュー9328

おすすめ

転載: blog.csdn.net/weixin_43767691/article/details/103395910