原创 c语言数据结构 6.8 二叉树的高度求解(一)

2010-1-18 17:44 5124 9 9 分类: 软件与OS

#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);


}


5a58bb8c-e6cb-4a28-bf84-3fa37afe55d7.jpg

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条