#include <iostream>
#include <cstdlib>
#include <stack>
using namespace std;
struct BinTree {
int data;
struct BinTree *left;
struct BinTree *right;
};
struct BinPost {
BinTree *pTree;
bool isFirst;
};
void CreateBinTree(BinTree* &root)
{
int data;
cin>>data;
if(data == 0)
root = NULL;
else {
root = (BinTree*)malloc(sizeof(BinTree));
root->data = data;
CreateBinTree(root->left);
CreateBinTree(root->right);
}
}
void preOrderFirst(BinTree *root)
{
if(root) {
cout<<root->data<<' ';
preOrderFirst(root->left);
preOrderFirst(root->right);
}
}
void inOrderFirst(BinTree *root)
{
if(root) {
inOrderFirst(root->left);
cout<<root->data<<' ';
inOrderFirst(root->right);
}
}
void postOrderFirst(BinTree *root)
{
if(root) {
postOrderFirst(root->left);
postOrderFirst(root->right);
cout<<root->data<<' ';
}
}
void preOrderSecond(BinTree *root)
{
BinTree *p;
stack<BinTree*> stk;
stk.push(root);
while(!stk.empty()) {
p = stk.top();
while(p != NULL) {
cout<<p->data<<' ';
p = p->left;
stk.push(p);
}
stk.pop();
if(!stk.empty()) {
p = stk.top(); stk.pop();
if(p) {
p = p->right;
stk.push(p);
}
}
}
}
void inOrderSecond(BinTree *root)
{
BinTree *p;
stack<BinTree*> stk;
stk.push(root);
while(!stk.empty()) {
p = stk.top();
while(p != NULL) {
p = p->left;
stk.push(p);
}
stk.pop();
if(!stk.empty()) {
p = stk.top(); stk.pop();
if(p) {
cout<<p->data<<' ';
p = p->right;
stk.push(p);
}
}
}
}
void postOrderSecond(BinTree *root)
{
BinTree *p;
BinPost *q;
BinPost *post = (BinPost*)malloc(sizeof(BinPost));
stack<BinPost*> stk;
post->isFirst = true;
post->pTree = root;
stk.push(post);
while(!stk.empty()) {
q = stk.top();
p = q->pTree;
while(p != NULL) {
p = p->left;
post = (BinPost*)malloc(sizeof(BinPost));
post->isFirst = true;
post->pTree = p;
stk.push(post);
}
stk.pop();
if(!stk.empty()) {
q = stk.top();
p = q->pTree;
if(q->isFirst) {
q->isFirst = false;
p = p->right;
post = (BinPost*)malloc(sizeof(BinPost));
post->isFirst = true;
post->pTree = p;
stk.push(post);
} else {
cout<<p->data<<' ';
q->pTree = NULL;
}
}
}
}
int main()
{
BinTree *root;
CreateBinTree(root);
preOrderFirst(root);
cout<<endl;
preOrderSecond(root);
cout<<endl;
inOrderFirst(root);
cout<<endl;
inOrderSecond(root);
cout<<endl;
postOrderFirst(root);
cout<<endl;
postOrderSecond(root);
cout<<endl;
return 0;
}
原文地址:http://blog.csdn.net/u012637838/article/details/40626367