#include<stdio.h>
#include<stdlib.h>
typedef char elemtype;
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//FCA##DB###EH##GM###
BiTree CreatBiTree() //3
{
BiTree T;
char c;
scanf("%c",&c);
if('#'==c){
T=NULL; //4
}
else{
T=(BiTree)malloc(sizeof(BiTNode)); //申请一个节点
T->data=c;
T->lchild=CreatBiTree(); //1 不为空,执行1,然后返回到3;
// 为空,从3执行到4,返回T,即返回到上一个断点的地方-19行,然后执行2;返回到3;
T->rchild=CreatBiTree(); //2
}
return T;
}
visit(char data) //提示没有类型,在函数前加void
{
printf("%c\n",data);
}
PreOrderTraverse(BiTree T)
{
if(T){
visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->lchild);
visit(T->data);
InOrderTraverse(T->rchild);
}
}
PostOrderTraverse(BiTree T)
{
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
visit(T->data);
}
}
//int Depth(BiTree T)
//{
//
// int m,n;
// if(T=NULL) return 0;
// else{
// m=Depth(T->lchild);
// n=Depth(T->rchild);
// if(m>n) return(m+1);
// else return(n+1);
// }
//}
void seqtraverse(BiTree T)
{
if(T)
{
BiTree a[100];
a[0]=T;
int first=0;
int rear=1;
while(first<rear){
printf("%c",a[first]->data);
if(a[first]->lchild)
{
a[rear++]=a[first]->lchild;
}
if(a[first]->rchild)
{
a[rear++]=a[first]->rchild;
}
first++;
}
}
}
int main()
{
BiTree T;
T=CreatBiTree();
printf("先序遍历二叉树\n");
PreOrderTraverse(T);
printf("中序遍历二叉树\n");
InOrderTraverse(T);
printf("后序遍历二叉树\n");
PostOrderTraverse(T);
printf("二叉树的层次遍历\n");
seqtraverse(T);
//printf("二叉树的高度为:%d",Depth(T));
return 0;
}
二叉树的遍历方法有:先序,中序和后序遍历。
二叉树本质用了递归思想:
先序:先遍历根,再遍历左子树,之后右子树
中序:先遍历左子树,再遍历根,之后右子树
后序:先遍历左子树,再遍历右子树,之后根
不管哪种遍历方法,一定是先遍历左子树,然后才是右子树。