先行順走査:
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)に圧縮されたバイナリツリー、スペースの複雑さをトラバースする方法