源自:http://blog.csdn.net/cxllyg/article/details/7520037
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <queue>
#include <stack>
#include <iostream>
using namespace std;
typedef struct BiTNode
{
char data;
BiTNode *lchild, *rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)//建树,按先序顺序输入节点
{
char ch;
scanf("%c",&ch);
if(ch==' ')
{
T=NULL;
return;
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
exit(1);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void CreateBiTree2(BiTree &T)//建树,按先序顺序输入节点
{
T=(BiTree)malloc(sizeof(BiTNode));
BiTree T1=(BiTree)malloc(sizeof(BiTNode));
BiTree T2=(BiTree)malloc(sizeof(BiTNode));
T->data='a';
T->lchild=T1;
T->rchild=T2;
T1->data='b';
T1->lchild=NULL;
T1->rchild=NULL;
T2->data='c';
T2->lchild=NULL;
T2->rchild=NULL;
}
void InOrderTraverse(BiTree T)//非递归中序遍历
{
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
printf("%c",T->data);
T=T->rchild;
}
}
void PreOrderTraverse(BiTree T)//非递归先序遍历
{
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T || !Stack.empty())
{
while(T)
{
Stack.push(T);
printf("%c",T->data);
T=T->lchild;
}
T=Stack.top();
Stack.pop();
T=T->rchild;
}
}
void PostOrderTraverse(BiTree T)//非递归后序遍历,用一个标记标记右子树是否访问过
{
int flag[20];
stack<BiTree> Stack;
if(!T)
{
printf("空树!\n");
return;
}
while(T)
{
Stack.push(T);
flag[Stack.size()]=0;
T=T->lchild;
}
while(!Stack.empty())
{
T=Stack.top();
while(T->rchild && flag[Stack.size()]==0)
{
flag[Stack.size()]=1;
T=T->rchild;
while(T)
{
Stack.push(T);
flag[Stack.size()]=0;
T=T->lchild;
}
T=Stack.top();
}
printf("%c",T->data);
Stack.pop();
}
}
void main()
{
BiTree T;
CreateBiTree(T);//input: "abc de f hi "
//CreateBiTree2(T);
PreOrderTraverse(T);
printf("\n");
InOrderTraverse(T);
printf("\n");
PostOrderTraverse(T);
printf("\n");
}
浙公网安备 33010602011771号