二叉树的前序遍历、中序遍历、后续遍历
(包括递归、非递归,共六种)
如有不当之处,望指正!!!
1、前序遍历(递归):
算法实现一:
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode//定义结构体
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T) //前序创建树
{
char ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
{
T=(struct BiTNode*)malloc(sizeof(struct BiTNode));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int print(BiTree T)//前序遍历(输出二叉树)
{
if(T==NULL)return 0;
else if(T->lchild==NULL&& T->rchild==NULL)return 1;
else returnprint(T->lchild)+print(T->rchild);
}
void main()//主函数
{
BiTree T;
CreateBiTree(T);
printf("%d\n",print(T));
}
算法实现二:
#include<stdio.h>
#include<stdlib.h>
struct BiTNode//定义结构体
{
char data;
structBiTNode *lchild,*rchild;
};
int num=0;
void CreatBiTree(struct BiTNode *&p) //前序创建树
{
char ch;
scanf("%c",&ch);
if(ch==' ') p=NULL;
else
{
p=(struct BiTNode *)malloc(sizeof(struct BiTNode));
p->data=ch;
CreatBiTree(p->lchild);
CreatBiTree(p->rchild);
}
}
void print(struct BiTNode *p) //前序遍历(输出二叉树)
{
if(p!=NULL)
{
if(p->lchild==NULL&&p->rchild==NULL)
else
{
print(p->lchild);
print(p->rchild);
}
}
}
void main()//主函数
{
struct BiTNode *p;
CreatBiTree(p);
print(p);
printf("%d\n",num);
}
2、中序遍历(递归):
#include<stdio.h>
#include<stdlib.h>
struct BiTNode//定义结构体
{
char data;
struct BiTNode *lchild,*rchild;
};
void later(struct BiTNode *&p) //前序创建树
{
char ch;
scanf("%c",&ch);
if(ch==' ')
p=NULL;
else
{
p=(struct BiTNode *)malloc(sizeof(struct BiTNode));
p->data=ch;
later(p->lchild);
later(p->rchild);
}
}
void print(struct BiTNode *p) //中序遍历(输出二叉树)
{
if(p!=NULL)
{
print(p->lchild);
printf("%c",p->data);
print(p->rchild);
}
else
printf(" ");
}
void main()//主函数
{
struct BiTNode *p;
later(p);
print(p);
}
3、后序遍历(递归):
#include<stdio.h>
#include<stdlib.h>
struct BiTNode//定义结构体
{
char data;
struct BiTNode *lchild,*rchild;
};
void later(structBiTNode *&p)//前序创建树
{
char ch;
scanf("%c",&ch);
if(ch==' ')
p=NULL;
else
{
p=(struct BiTNode*)malloc(sizeof(struct BiTNode));
p->data=ch;
later(p->lchild);
later(p->rchild);
}
}
void print(structBiTNode *p)//后序遍历(输出二叉树)
{
if(p!=NULL)
{
print(p->lchild);
print(p->rchild);
printf("%c",p->data);
}
else
printf("");
}
void main()//主函数
{/*检测:printf("到了吗");*/
struct BiTNode *p;
later(p);
print(p);
}
4、前序遍历(非递归):
#include<stdio.h>
#include<stdlib.h>
struct BiTNode*stack[100];
struct BiTNode//定义结构体
{
char data;
struct BiTNode *lchild,*rchild;
};
void later(structBiTNode *&p)//前序创建树
{
char ch;
scanf("%c",&ch);
if(ch==' ')
p=NULL;
else
{
p=(struct BiTNode*)malloc(sizeof(struct BiTNode));
p->data=ch;
later(p->lchild);
later(p->rchild);
}
}
void print(structBiTNode *p)//前序遍历(输出二叉树)
{
int i=-1;
while(1)
{
while(p!=NULL)
{
stack[++i]=p->rchild;/*printf("ok?\n");*/
printf("%c",p->data);
p=p->lchild;
}
if(i!=-1)
{
p=stack[i];
i--;
}
else
return;
}
}
void main()//主函数
{
struct BiTNode *p,*t;
later(p);
print(p);
}
5、中序遍历(非递归)
#include<stdio.h>
#include<stdlib.h>
struct BiTNode*stack[100];
struct BiTNode//定义结构体
{
chardata;
struct BiTNode *lchild,*rchild;
};
void later(structBiTNode *&p)//前序创建树
{
char ch;
scanf("%c",&ch);
if(ch==' ')
p=NULL;
else
{
p=(struct BiTNode*)malloc(sizeof(struct BiTNode));
p->data=ch;
later(p->lchild);
later(p->rchild);
}
}
void print(structBiTNode *p)//中序遍历(输出二叉树)
{
int i=-1;
while(1)
{
while(p!=NULL)
{
i++;
stack[i]=p;
p=p->lchild;
}
if(i!=-1)
{
p=stack[i];
i--;
printf("%c",p->data);
p=p->rchild;
}
}
}
void main()//主函数
{
struct BiTNode *p;
later(p);
print(p);
}
6、后续遍历(非递归):
#include<stdio.h>
#include<stdlib.h>
struct BiTNode*stack[100];
struct BiTNode//定义结构体
{
char data;
structBiTNode *lchild,*rchild;
};
void later(structBiTNode *&p)//前序创建树
{
char ch;
scanf("%c",&ch);
if(ch==' ')
p=NULL;
else
{
p=(struct BiTNode*)malloc(sizeof(struct BiTNode));
p->data=ch;
later(p->lchild);
later(p->rchild);
}
}
void print(structBiTNode *p)//后序遍历(输出二叉树)
{
int i=-1;
while(1)
{
while(p!=NULL)
{
stack[++i]=p;/*printf.0("ok?\n");*/
p=p->lchild;
}
if(i!=-1)
{
while(p==stack[i]->rchild||(p==stack[i]->lchild&&stack[i]->rchild==NULL))
{
p=stack[i--];
printf("%c",p->data);
if(i==-1)
return;
}
p=stack[i]->rchild;
}
else
return;
}
}
int main()//主函数
{
struct BiTNode *p,*t;
later(p);
print(p);
printf("\n");
system("pause");
return 0;
}
供测试使用的数据
前序创建二叉树 | 中序 | 后序 |
/*AB D C */
| BDAC | DBCA |
/*ABC D EF G */
| CBDAFEG | CDBFGEA |