代码如下:
// CreateBinaryTree1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
} treenode;
treenode* CreateBinTree()
{
char x;
cin>>x;
treenode* temp;
if ('$'==x)
{
temp=NULL;
}
else
{
temp = new treenode;
temp->data = x;
temp->lchild=CreateBinTree();
temp->rchild=CreateBinTree();
}
return temp;
}
//前序遍历
void preorder(treenode* p)
{
if(p!=NULL)
{
cout<<p->data<<" ";
preorder(p->lchild);
preorder(p->rchild);
}
}
//中序遍历
void midorder(treenode* p)
{
if(p!=NULL)
{
midorder(p->lchild);
cout<<p->data<<" ";
midorder(p->rchild);
}
}
//后序遍历
void postorder(treenode* p )
{
if(p!=NULL)
{
postorder(p->lchild);
postorder(p->rchild);
cout<<p->data<<" ";
}
}
//非递归先根遍历
void PreOrder2(treenode *root)
{
stack<treenode*>T;
T.push(root);
treenode *p=new treenode;
while(!T.empty())
{
p=T.top();
T.pop();
cout<<p->data<<" ";
if(p->rchild)
{
T.push(p->rchild);
}
if(p->lchild)
{
T.push(p->lchild);
}
}
cout<<endl;
}
//非递归中序遍历
void midorder2(treenode *root)
{
stack<treenode*>T;
treenode *p=root;
while((NULL!=p)||!T.empty())
{
if(NULL!=p)
{
T.push(p);
p=p->lchild;
}
else
{
p=T.top();
T.pop();
cout<<p->data<<" ";
p=p->rchild;
}
}
cout<<endl;
}
//非递归后序遍历
void postOrder2(treenode *root)
{
stack<treenode*>T;
treenode *p=root;
treenode *pre=NULL;
while((NULL!=p)||!T.empty())
{
while(p)
{
T.push(p);
p=p->lchild;
}
p=T.top();
//如果p没有右孩子或者其右孩子刚刚被访问过
if(p->rchild == NULL || p->rchild == pre)
{
cout<<p->data<<" ";
T.pop();
pre=p;
p=NULL;
}
else
{
p=p->rchild;
}
}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"请以先根遍历输入一序列,$表示空:\n";
treenode *root = CreateBinTree();
cout<<"前序遍历: ";
preorder(root);
cout<<endl;
cout<<"中序遍历:";
midorder(root);
cout<<endl;
cout<<"后序遍历:";
postorder(root);
cout<<endl;
cout<<"非递归前序遍历:";
PreOrder2(root);
cout<<endl;
cout<<"非递归中序遍历:";
midorder2(root);
cout<<endl;
cout<<"非递归后序遍历:";
postOrder2(root);
cout<<endl;
system("pause");
return 0;
}
结果如下: