#include<iostream>
#include<stack>
#include<vector>
using namespace std;
template<typename T>
struct TreeNode
{
T value;
TreeNode<T> * left;
TreeNode<T> * right;
bool visit;
TreeNode(T v) :value(v), visit(false), left(nullptr), right(nullptr){}
};
template <typename T>
void CreateTree(TreeNode<T> * root)
{
TreeNode<T> * node1 = new TreeNode<T>(1);
TreeNode<T> * node2 = new TreeNode<T>(2);
TreeNode<T> * node3 = new TreeNode<T>(3);
TreeNode<T> * node4 = new TreeNode<T>(4);
root->left = node1;
root->right = node2;
node1->left = node3;
node3->right = node4;
}
template<typename T>
void PreTraverse(TreeNode<T> * root)
{
stack<TreeNode<T>*> sta;
vector<T> result;
if (root == nullptr)
return;
sta.push(root);
result.push_back(root->value);
root->visit = 1;
while (!sta.empty())
{
TreeNode<T>* temp = sta.top();
if (temp->left != nullptr&&temp->left->visit==0)
{
result.push_back(temp->left->value);
sta.push(temp->left);
temp->left->visit = 1;
}
else
{
sta.pop();
if (temp->right != nullptr)
{
result.push_back(temp->right->value);
sta.push(temp->right);
temp->right->visit = 1;
}
}
}
for (auto au:result)
{
cout << au << "\t";
}
cout << endl;
}
template<typename T>
void MidTraverse(TreeNode<T> * root)
{
stack<TreeNode<T>*> sta;
vector<T> result;
if (root == nullptr)
return;
sta.push(root);
while (!sta.empty())
{
TreeNode<T>* temp = sta.top();
if (temp->left != nullptr&&temp->left->visit == 0)//左节点为空或已访问
{
sta.push(temp->left);
}
else
{
result.push_back(temp->value);
temp->visit = 1;
sta.pop();//当结点的右结点入栈后,该结点已经没有用,可以进行删除。该节点已经输出且右结点也保存
if (temp->right != nullptr)
{
sta.push(temp->right);
}
}
}
for (auto au : result)
{
cout << au << "\t";
}
cout << endl;
}
template<typename T>
void PostTraverse(TreeNode<T> * root)
{
stack<TreeNode<T>*> sta;
vector<T> result;
if (root == nullptr)
return;
sta.push(root);
while (!sta.empty())
{
TreeNode<T>* temp = sta.top();
if (temp->left != nullptr&&temp->left->visit == 0)//左节点不为空且没有访问过
{
sta.push(temp->left);
}
else
{
if (temp->right!=nullptr&&temp->right->visit==0)//右结点不为空且没有访问过
{
sta.push(temp->right);
}
else
{//左右结点都为空,或左右结点都访问过
sta.pop();
result.push_back(temp->value);
temp->visit = 1;
}
}
}
for (auto au : result)
{
cout << au << "\t";
}
cout << endl;
}
int main()
{
TreeNode<int> * root=new TreeNode<int>(0);
cout << "前序遍历结果:"<<"\t";
CreateTree(root);
PreTraverse(root);
cout << "中序遍历结果:" << "\t";
CreateTree(root);
MidTraverse(root);
cout << "后序遍历结果:" << "\t";
CreateTree(root);
PostTraverse(root);
return 0;
}
测试结果:
测试二叉树:
运行结果: