#include<stdio.h>
#define max 20 //二叉树中最多节点数
typedef struct node //节点类型
{
char data;
struct node *lchild,*rchild;
}bitree;
bitree *cre_tree(char *str,int i,int m)
{bitree *p;
if(i>=m)
return NULL;
p=(bitree *)malloc(sizeof(bitree)); /生成新节点
p->data=str; //j将第一个节点赋值
p->lchild=cre_tree(str,2*i+1,m); //创建新节点的左子树
p->rchild=cre_tree(str,2*i+2,m); //创建新节点右子树
return p;
}
bitree *swap(bitree *p) //将根节点指向的左右子树互换
{
bitree *stack[max]; //stack为指针类型堆栈
int k;
k=0;
stack[k]=NULL; //交换左右节点
if(p!=NULL)
{
stack[++k]=p->lchild;
p->lchild=p->rchild;
p->rchild=stack[k];
p->lchild=swap(p->lchild); /将p节点指向的左右孩子互换
p->rchild=swap(p->rchild); //将p节点右指针指向的孩子互换
}
return p;
}
void preorder(bitree *t) //前序遍历二叉树
{
if(t!=NULL)
{
printf("%c",t->data);
if(t->lchild)
{
printf("->");
preorder(t->lchild);
}
if(t->rchild)
{
printf("->");
preorder(t->rchild);
}
}
}
void inorder(bitree *t) //中序遍历二叉树
{
if(t!=NULL)
{
inorder(t->lchild);
printf("%c",t->data);
printf("->");
inorder(t->rchild);
}
}
void lev_order(bitree *t,int m) //按层遍历二叉树
{
bitree *queue[max];
bitree *p;
int front="0",rear=0;
queue[rear++]=t;
while(front!=rear)
{
p="queue"[front];
front=(front+1)%m;
printf("%c",p->data); //输出根节点的指针
printf("->");
if(p->lchild!=NULL) //遍历左子树
{
if((rear+1)%m!=front)
{
queue[rear]=p->lchild;
rear=(rear+1)%m;
}
}
if(p->rchild!=NULL) //遍历右子树
{
if((rear+1)%m!=front)
{
queue[rear]=p->rchild;
rear=(rear+1)%m;
}
}
}
}
int treehigh(t) //计算二叉树的高度
bitree *t; //可以在此处定义全局变量
{int lh,rh,h;
if(t==NULL)
h=0;
else
{
lh=treehigh(t->lchild); //统计左孩子个数
rh=treehigh(t->rchild); //统计右孩子个数
h=(lh>rh ? lh:rh)+1; //谁大取谁再加根节点
}
return(h);
}
//主函数
void main()
{
int i, n,y;
char str[max]; //字符型数组
bitree *root; //根指针
//clrscr(); //在vc中不用
printf("please input node num:\n");
scanf("%d",&n);
getchar(); //在tc中会提示无效但必须有才正常工作
printf("please input a string which lenghth is %d:",n);
for(i=0;i<n;i++) //开始输出字符串
str=getchar();
printf( "\n\n");
root=cre_tree(str,0,n); //创建root指向的二叉树
y=treehigh(root); //调用高度子函数
printf("height is :%d\n",y); //输出高度
printf("%c\n\n",root->data); //输出根节点的值
printf("lev_order before swaping:");
lev_order(root,n); //按层遍历前的链表
printf("\n");
printf("preorder before swaping:");
preorder(root); //前序遍历二叉树
printf("\n");
printf("inorder before swaping:");
inorder(root);
printf("\n\n");
root=swap(root);
printf("lev_order afrer swaping:");
lev_order(root,n);
printf("\n");
printf("preorder after swaping:");
preorder(root);
printf("\n");
printf("inorder after swaping:");
inorder(root);
}
文章评论(0条评论)
登录后参与讨论