图为创建一个简单的二叉树,你们也可以创建一些复杂的!
好了,直接上代码!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef struct BiTNode{
char data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
Status CreateBiTree(BiTree &T){//创建树
char ch;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))exit(0);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 1;
}
Status Visit(BiTree T){
if(T){
printf("%c",T->data);
return 1;
}
return 0;
}
Status PreOrderTraverseFirst(BiTree T){//先序遍历
if(T){
Visit(T);
PreOrderTraverseFirst(T->lchild);
PreOrderTraverseFirst(T->rchild);
return 1;
}
return 0;
}
Status PreOrderTraverseSecond(BiTree T){//中序遍历
if(T){
PreOrderTraverseSecond(T->lchild);
Visit(T);
PreOrderTraverseSecond(T->rchild);
return 1;
}
return 0;
}
Status PreOrderTraverseThree(BiTree T){//后序遍历
if(T){
PreOrderTraverseThree(T->lchild);
PreOrderTraverseThree(T->rchild);
Visit(T);
return 1;
}
return 0;
}
void LevelOrder(BiTNode *b){
BiTNode *p;
BiTNode *qu[10];//定义循环队列,存放节点指针
int front,rear;
front=rear=0;//置队列为空队列
rear++;
qu[rear]=b;//根节点指针进队
while(front!=rear){//队列不为空
front=(front+1)%10;//队头出队
p=qu[front];//
printf("%c",p->data);//访问节点
if(p->lchild!=NULL){//有左孩子时将其进队
rear=(rear+1)%10;
qu[rear]=p->lchild;
}
if(p->rchild!=NULL){//有右孩子时将其进队
rear=(rear+1)%10;
qu[rear]=p->rchild;
}
}
}
void menu()
{
printf("\n\t\t\t1.创建树");
printf("\n\t\t\t0.退出");
printf("\n\t\t请选择:");
}
int main()
{
BiTree T;
char e;
int n;
while (1)
{
menu();
scanf("%d",&n);
switch(n) {
case 1:
printf("\n\t\t\t创建树\n\t\t\t");
getchar();
CreateBiTree(T);
printf("\n\t\t\t先序遍历 :");
PreOrderTraverseFirst(T);
printf("\n\t\t\t中序遍历:");
PreOrderTraverseSecond(T);
printf("\n\t\t\t后续遍历 :");
PreOrderTraverseThree(T);
printf("\n\t\t\t层次遍历:");
LevelOrder(T);
break;
case 0:exit(1);
break;
default:printf("\n操作有误!!!");break;
}
printf("\n\n\n");
}
return 0;
}