现在的位置: 首页 > 综合 > 正文

二叉树算法(数据结构)

2013年10月16日 ⁄ 综合 ⁄ 共 3592字 ⁄ 字号 评论关闭

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

typedef struct TNode{

      char data;

      struct TNode*lchild,*rchild;

}TNode,*Tree;

Tree Creat( )//按先序序列建立二叉树

{

         Tree T;

         char ch=getchar();

         if(ch=='#') 

                 T=NULL;

         else

        {

                 T=(TNode*)malloc(sizeof(TNode));

                 T->data=ch;

                 T->lchild=Creat();

                 T->rchild=Creat();

        }

        return T; 

}


void PreOrder(Tree T)//先序遍历————递归

{    

         TNode *p=T;

         if (p != NULL)

         { 

               printf("   %c",p->data);

               PreOrder(p->lchild ) ;  

               Preorder(p->rchild ) ; 

         }

}

void Middle(Tree T)//中序遍历——递归

{   

        TNode *p=T;

        if (p != NULL)

        { 

                  Middle( p-> lchild ) ; 

                  printf("   %c", p ->data); 

                  Middle(p-> rchild ) ; 

        }

}

void PostOrder(Tree T)//后序遍历——递归

{    

        TNode *p=T;

        if (p != NULL){ 

                  PostOrder( p-> lchild ) ; 

                  PostOrder( p-> rchild ) ; 

                  printf("   %c", p ->data); 

        }

}


int Leaf(Tree T)//叶子结点个数

{

         TNode *p=T;

         if(p != NULL)

         {

                 if((p->lchild==NULL)&&(p->rchild==NULL))

                        return 1;

                 else 

                        return(Leaf(p->lchild)+Leaf(p->rchild));

         }

         else

                return 0;

}


int Depth(Tree T)//树的深度

{

          TNode *p=T;

          int l,r;

          if(!p) 

                  return 0;

          else 

          {

                  l=Depth(p->lchild); 

                  r=Depth(p->rchild);

                  if(l>r)

                           return l+1; 

                  else 

                           returnr+1;

          }    

}


void Change(Tree T)//结点交换

{

          TNode *p=T;

           if(p!=NULL)

           {

                    p=T->lchild;

                    T->lchild=T->rchild;

                    T->rchild=p;

                    Change(T->lchild);

                    Change(T->rchild);

          }

}

void ShowMenu()

{

           printf("\t\t\t****二叉树算法**** \n");                               

           printf("\t\t\t~~~~~~~~~~~~~~~~ \n");                  

           printf("\t\t\t#1.  先序遍历   #\n");

           printf("\t\t\t#2.  中序遍历   #\n"); 

           printf("\t\t\t#3.  后序遍历   #\n"); 

           printf("\t\t\t#4.  叶子个数   #\n");

           printf("\t\t\t#5. 二叉树深度 #\n");

           printf("\t\t\t#6.  结点交换   #\n");

           printf("\t\t\t#0.  退出程序   #\n");

           printf("\t\t\t~~~~~~~~~~~~~~~~\n");

}

int main()

{    

          Tree T;

           int  t,  l,  d ;

           printf("\t\t\t****创建二叉树****\n");

           printf("◤请输入树的各元素,用#表示空结点:\n");

           T=Creat();

     

           while(1)

           {    

                    ShowMenu();

                    printf("◤请您选择(0-6):");

                    scanf("%d",&t);

                    switch(t)

                    {   

                    case1: printf("  ◎先序遍历:");PreOrder(T);printf("\n"); break;     

                    case 2: printf("  ◎中序遍历:");Middle(T);printf("\n"); break;     

                    case3: printf("  ◎后序遍历:");PostOrder(T);  printf("\n"); break;    

                    case4: printf("  ◎叶子结点个数:");l=Leaf(T);printf(" %d 个\n",l); break;

                    case5: printf("  ◎二叉树深度:");d=Depth(T);printf(" %d\n",d); break;

                    case6: printf("  █各结点已交换█");Change(T);printf("\n",d); break;                                         

                    case0: printf("\t\t******谢谢使用,再见!******\n");return 0;break;

                    default: printf("※输入出错!!!请重输:\n");

            }

}

抱歉!评论已关闭.