1.二叉树先序,中序,后序遍历
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild; //创建二叉树
}BiTNode,*BiTree;
void PreOrderTraverse(BiTree T)//二叉树的先序遍历
{
if(T==NULL)
return ;
printf("%c ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void InOrderTraverse(BiTree T)//二叉树的中序遍历
{
if(T==NULL)
return ;
InOrderTraverse(T->lchild);
printf("%c ",T->data);
InOrderTraverse(T->rchild);
}
void PostOrderTraverse(BiTree T)//后序遍历
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ",T->data);
}
void CreateBiTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
if(!*T)
exit(-1);
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
}
int main()
{
BiTree T;
printf("请给二叉树按照先序方式依次输入结点的值(空结点为#):\n");
//例子:AB#D##C##
CreateBiTree(&T);
printf("先序方式遍历结果:\n");
PreOrderTraverse (T);
printf("中序方式遍历结果:\n");
InOrderTraverse(T);
printf("后序方式遍历结果:\n");
PostOrderTraverse(T);
return 0;
}
运行示例:
2.求二叉树深度:
#include<stdio.h>
#include<stdlib.h>
int deep=0;//在遍历树的过程中表示当前深度。
struct bitree
{
char data;
struct bitree* lchild;
struct bitree* rchild;
int deepth;
};//储存结点信息,指向左右子树的指针,以及该结点深度。
struct bitree* precreat(struct bitree* t)
{
char ch;
scanf("%c",&ch);
deep++;//每次调用函数深度+1.
if(ch=='#')t=NULL;
else
{
if(!(t=(struct bitree*)malloc(sizeof(struct bitree))))exit(0);
t->data=ch;
t->lchild=precreat(t->lchild);
t->rchild=precreat(t->rchild);
t->deepth=deep;
}
deep--;//函数调用完退栈深度—1.
return t;
}//先序建立二叉树。
void preordertraverse(struct bitree* t)
{
if(t)
{
printf("%c 深度:%d\n",t->data,t->deepth);
preordertraverse(t->lchild);
preordertraverse(t->rchild);
}
}//先序遍历二叉树。
int main()
{
struct bitree* t;
printf("请输入您要创建的先序树:");
t=precreat(t);
printf("对此树先序遍历的结果:\n");
preordertraverse(t);
return 0;
}
示例:
3.二叉树的层次遍历
/*利用队列实现二叉树的层次遍历*/
#include<stdio.h>
#define maxsize 100
#define NULLData 0
typedef char datatype;
/*二叉链表类型定义*/
typedef struct Binnode
{
datatype data; /*数据域*/
struct BinNode* lchild,*rchild; /*指向左、右孩子的指针*/
}BinNode,*Bintree;
/*循环队列类型定义*/
typedef struct seqqueue
{
Bintree data[maxsize]; /*二叉链表类型的指针数组*/
int front,rear; /*队首指针、队尾指针*/
}SeqQue,*SeQue;
/*按先序创建二叉树*/
Bintree CreateTree(Bintree T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
return 0;
else
{
T=(Bintree)malloc(sizeof(BinNode));
T->data=ch;
T->lchild=CreateTree(T->lchild);/*创建左子树*/
T->rchild=CreateTree(T->rchild);/*创建右子树*/
}
return T;
}
/*初始化循环队列*/
void InitQue(SeQue Q)
{
Q->front=Q->rear=0;
}
/*判队列空*/
int EmptyQue(SeQue Q)
{
if(Q->front==Q->rear)
return 1;
else
return 0;
}
/*入队列*/
int EnQue(SeQue Q,Bintree T)
{
if((Q->rear+1)%maxsize==Q->front)
{
printf("队列已满!\n"); /*队列满,入队失败。*/
return 0;
}
else
{
Q->rear=(Q->rear+1)%maxsize;
Q->data[Q->rear]=T;
return 1; /*入队列成功*/
}
}
/*出队列*/
int OutQue(SeQue Q)
{
if(EmptyQue(Q)) /*判断队列是否为空*/
{
printf("队列空!\n");
return 0;
}
else
{
Q->front=(Q->front+1)%maxsize;/*不为空,出队列。*/
return 1;
}
}
/*取队列首元素*/
Bintree Gethead(SeQue Q)
{
if(EmptyQue(Q)) /*判断队列是否为空*/
return NULLData;
else
return Q->data[(Q->front+1)%maxsize];
}
/*层次遍历二叉树*/
void Levelorder(Bintree T)
{
Bintree p;
SeqQue Q;
InitQue(&Q); /*初始化队列*/
if(T!=NULL)
{
EnQue(&Q,T); /*根结点入队列*/
while(!EmptyQue(&Q))
{
p=Gethead(&Q);
OutQue(&Q); /*结点出队列*/
printf("%c ",p->data); /*被访问结点*/
if(p->lchild!=NULL)
EnQue(&Q,p->lchild);/*左孩子结点入队列*/
if(p->rchild!=NULL)
EnQue(&Q,p->rchild);/*右孩子结点入队列*/
}
}
}
main()
{
Bintree t;
printf("请按先序的方式输入二叉树的结点元素(注:#表示节点为空):");
t=CreateTree(t);
printf("按层次遍历输出:");
Levelorder(t);
}
示例: