这个说明网上非常多,就直接上代码了。
#include <iostream>
#include <vector>
#include <deque>
#include <stack>
using namespace std;
struct BinaryTreeNode
{
int value;
BinaryTreeNode * left;
BinaryTreeNode * right;
};
//增加节点
void addNode(BinaryTreeNode *& node, int value)
{
if(NULL == node)
{
node = new BinaryTreeNode;
node->value = value;
node->left = NULL;
node->right = NULL;
//cout<< node->value<<" ";
}
if(node->value > value)
addNode(node->left, value);
if(node->value < value)
addNode(node->right, value);
if(node->value == value)
return;
}
//层次遍历
void PrintFromTopToButtom(BinaryTreeNode* root)
{
cout<<"层次遍历:";
if(!root)
return;
deque<BinaryTreeNode*> queue;
queue.push_back(root);
while(queue.size())
{
BinaryTreeNode* temp = queue.front();
queue.pop_front();
cout<<temp->value<<" ";
if(temp->left)
queue.push_back(temp->left);
if(temp->right)
queue.push_back(temp->right);
}
cout<<endl;
}
//非递归前序遍历实现
void preorderTree(BinaryTreeNode* root)
{
cout<<"前序遍历:";
//BinaryTreeNode* node;
if(!root)
return;
stack<BinaryTreeNode*> mystack;
//mystack.push(root);
while(!mystack.empty() || root)
{
while(root)
{
cout<<root->value<<" ";
mystack.push(root);
root = root->left;
}
root = mystack.top();
mystack.pop();
root = root->right;
}
cout<<endl;
}
//非递归中序遍历
void inorderTree(BinaryTreeNode* root)
{
cout<<"中序遍历:";
if(!root)
return;
stack<BinaryTreeNode*> mystack;
while(root || !mystack.empty())
{
while(root)
{
mystack.push(root);
root = root->left;
}
root = mystack.top();
mystack.pop();
cout<<root->value<<" ";
root = root->right;
}
cout<<endl;
}
//非递归后序遍历
void postorderTree(BinaryTreeNode* root)
{
cout<<"后序遍历:";
if(!root)
return;
stack<BinaryTreeNode*> mystack;
stack<int> tag;
while(!mystack.empty() || root)
{
while(root)
{
mystack.push(root);
tag.push(0);
root = root->left;
}
while(!tag.empty() && tag.top() == 1)//前一个条件主要是判断只剩根节点后的情况
{
root = mystack.top();
cout<<root->value<<" ";
tag.pop();
mystack.pop();
}
if(!mystack.empty())
{
root = mystack.top();
tag.pop();
tag.push(1);
root = root->right;
}
else
root = NULL;
}
cout<<endl;
}
int main()
{
BinaryTreeNode* root = NULL;
addNode(root, 10);
addNode(root, 5);
addNode(root, 12);
addNode(root, 4);
addNode(root, 7);
addNode(root, 24);
PrintFromTopToButtom(root);
preorderTree(root);
inorderTree(root);
postorderTree(root);
getchar();
return 0;
}