#include<stdio.h>
#include <stdlib.h>
#define MAX_LEN 50
#define ElemType char
#define Status int
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef struct Node{
ElemType data;
struct Node *lchild,*rchild;
}BiTreeNode,*BiTree;
/*递归创建一棵二叉树*/
void CreateBiTreeByRec(BiTree &T){
char ch;
scanf("%c",&ch);
if(ch=='#'){
T = NULL;
}else{
if(!(T = (BiTree)malloc(sizeof(BiTreeNode)))){
exit(OVERFLOW);
}
T->data = ch;
CreateBiTreeByRec(T->lchild);
CreateBiTreeByRec(T->rchild);
}
}
/*前序非递归创建二叉树*/
void CreateBiTreeByPreNoRec(BiTree &T){
char ch;
BiTree s[MAX_LEN]={NULL},p=NULL;
int top = 0;//栈顶指针
scanf("%c",&ch);
if('#'==ch){
T = NULL;
}else{
if(!(T = (BiTree)malloc(sizeof(BiTreeNode)))){
exit(OVERFLOW);
}
T->data = ch;
s[++top] = T;
p = T;
}
while(top!=0){
scanf("%c",&ch);
if(ch=='\n'){
break;
}
if(ch!='#'){
BiTree r;
if(!(r = (BiTree)malloc(sizeof(BiTreeNode)))){
exit(OVERFLOW);
}
r->data = ch;
r->lchild = NULL;
r->rchild = NULL;
p->lchild = r;
p = r;
s[++top] = r;
}else{
p->lchild = NULL;
scanf("%c",&ch);
while(ch=='#'){
p->rchild = NULL;
p = s[top--];
scanf("%c",&ch);
}
if(top!=0){
p = s[top--];
BiTree r;
if(!(r = (BiTree)malloc(sizeof(BiTreeNode)))){
exit(OVERFLOW);
}
r->data = ch;
r->lchild = NULL;
r->rchild = NULL;
p->rchild = r;
p = r;
s[++top] = r;
}
}
}
}
/*前序递归遍历*/
void PreOrderRec(BiTree &T){
if(NULL!=T){
printf("%c ",T->data);
PreOrderRec(T->lchild);
PreOrderRec(T->rchild);
}
}
/*前序非递归遍历*/
void PreOrder(BiTree &T){
BiTree s[MAX_LEN]={NULL},p=NULL;
int top = 0;
p = T;
do{
while(p!=NULL){
printf("%c ",p->data);
s[++top] = p;
p = p->lchild;
}
if(top==0){
break;
}else{
p = s[top--];
p = p->rchild;
}
}while(1);
}
/*中序递归遍历*/
void InOrderRec(BiTree &T){
if(T!=NULL){
InOrderRec(T->lchild);
printf("%c ",T->data);
InOrderRec(T->rchild);
}
}
/*中序非递归遍历*/
void InOrder(BiTree &T){
BiTree s[MAX_LEN]={NULL},p=NULL;
p = T;
int top = 0;
do{
while(p!=NULL){
s[++top] = p;
p = p->lchild;
}
if(top==0){
break;
}else{
p = s[top--];
printf("%c ",p->data);
p = p->rchild;
}
}while(1);
}
/*后序递归遍历*/
void PostOrderRec(BiTree &T){
if(T!=NULL){
PostOrderRec(T->lchild);
PostOrderRec(T->rchild);
printf("%c ",T->data);
}
}
/*后序非递归遍历*/
void PostOrder(BiTree &T){
BiTree s[MAX_LEN]={NULL},p=NULL;
int top = 0,mark[MAX_LEN]={0};
p = T;
do{
while(p!=NULL){
s[++top] = p;
mark[top] = 1;//第一次访问
p = p->lchild;
}
if(0==top){
break;
}else{
if(1==mark[top]){
mark[top] = 2;//第二次访问
p = s[top];
p = p->rchild;
}else{
p = s[top--];
printf("%c ",p->data);
p = NULL;
}
}
}while(1);
}
int main(){
BiTree T;
printf("Input BitTree Node: ");
CreateBiTreeByPreNoRec(T);
// CreateBiTreeByRec(T);
printf("========递归========\n");
printf("先序遍历:");
PreOrderRec(T);
printf("\n中序遍历:");
InOrderRec(T);
printf("\n后续遍历:");
PostOrderRec(T);
printf("\n========非递归========\n");
printf("先序遍历:");
PreOrder(T);
printf("\n中序遍历:");
InOrder(T);
printf("\n后续遍历:");
PostOrder(T);
printf("\n");
return 0;
}
验证:
A
/ \
B C
/ \
D H
\
E
/\
F G
运行结果: