二叉树实验5

来源:互联网 发布:豆瓣fm for windows 编辑:程序博客网 时间:2024/05/22 02:12
// 1.构建二叉树。<先序>// 2. 先中后 序遍历二叉树 <中,非递归>// 3.独生子女的个数。// 4.二叉树的深度。#include<cstdio>#include<cstdlib>#define   OK    1#define   OVERFLOW  -2#define   ERROR  0#define   MAX  20typedef  struct BiTNode{    char  data;    struct BiTNode *lchild, *rchild;}BiTNode, *BiTree;int GreateBiTree(BiTree &T) //  1 先序构建二叉树{    char ch;    scanf("%c",&ch);    if(ch=='#')    T=NULL;    else       {          if(!(T = (BiTNode *)malloc(sizeof(BiTNode))))          exit(OVERFLOW);          T->data = ch;          GreateBiTree(T->lchild);          GreateBiTree(T->rchild);       }     return OK;}  // GreateBiTreevoid PreOrder(BiTree T)  //  2.1 /*先序遍历的非递归算法*/{    BiTree stack[MAX],q;    int top=0,i;    for(i=0;i<MAX;i++)  stack[i]=NULL;/*初始化*/    q=T;    while(q!=NULL)     {         printf("%c",q->data);         if(q->rchild!=NULL)   stack[top++]=q->rchild;         if(q->lchild!=NULL)   q=q->lchild;         else             if(top>0) q=stack[--top];             else q=NULL;     }}/*中序遍历二叉树非递归 */typedef struct Snode{    char  data;    BiTree p;    /******修改******/    struct Snode *next;}Snode,*LinkStack;int InitStack(LinkStack &S)  //  创建堆栈  2.2.1{    S=NULL;    return OK;}int  StackEmpty(LinkStack S)  //  判断栈是不是空  2.2.2{    if(!S) return 1;    return 0;}int Push(LinkStack &S,BiTree P)  // 入栈  2.2.3{     Snode *e=new Snode;     if(!e)     {        return OVERFLOW;     }     e->p=P;  /******修改******/    // printf("%c->",P->data);     e->next=S;     S=e;     return OK;}int Pop(LinkStack &S,BiTree &P) //  出栈 2.2.4{     Snode *Q;     if(!S)     return ERROR;     P=S->p;     Q=S;     S=S->next;     delete Q;     return OK;}void InOrderTraverse(BiTree T) //  2.2{    BiTree P;    LinkStack S;    InitStack(S); //  2.2.1    P=T;    while(P||!StackEmpty(S)) //  2.2.2    {        if(P)        {           // printf("123\n");           Push(S,P);  P=P->lchild; //  2.2.3        }        else {                //printf("1\n");                Pop(S,P);  // 2.2.4                printf("%c",P->data);                P=P->rchild;             } //  else    }//  while} // InOrderTraverse/*  中序遍历二叉树非递归 */void PostOrder(BiTree p) //  2.3 后序遍历二叉树{   if ( p!= NULL )   {    PostOrder( p->lchild ) ;       PostOrder( p->rchild) ;       printf("%c", p->data);   }}int onechild(BiTree T) //   3 独生子女的个数{     int num1,num2;     if(T==NULL)     return 0;     else if((T->lchild==NULL && T->rchild!=NULL)||(T->lchild!=NULL && T->rchild==NULL))     return 1;        else        {            num1=onechild(T->lchild);            num2=onechild(T->rchild);            return  num1+num2;        }}int Depth(BiTree T ) //  4返回二叉树的深度{     int depthLeft,depthRight;     int  depthval=0;     if (!T)     int  depthval=0;     else{            depthLeft = Depth( T->lchild );            depthRight= Depth( T->rchild );            depthval= 1 + (depthLeft > depthRight ? depthLeft : depthRight);         }     return depthval;} // Depthint main(){   BiTree  T;   int m,n,k=1,dep,one;   printf("--------------构建一个二叉树-------------\n\n");   printf("输入二叉树的先序序列,用#代表虚结点,如ABD###CE##F#\n");   GreateBiTree(T);   printf("------------------------------\n");   printf("1.遍历二叉树:\n");   printf("2.求二叉树独生子女的个数:\n");   printf("3.求二叉树的深度:\n");   printf("4.退出:\n");   printf("------------------------------\n");   while(k)   {       printf("请选择 1-4步骤:\n");       scanf("%d",&m);       switch(m)       {          case 1:               {                  printf("------------------------------\n");                  printf("先序遍历二叉树:\n");                  PreOrder(T);                  printf("\n");                  printf("中序遍历二叉树:\n");                  InOrderTraverse(T);                  printf("\n");                  printf("后序遍历二叉树:\n");                  PostOrder(T);                  printf("\n");                  break;               }          case 2:               {                   one=onechild(T);                   printf("二叉树独生子女的个数是: %d\n\n",one);                   break;               }           case 3:                {                    dep=Depth(T);                    printf("二叉树的深度是: %d\n\n",dep);                    break;                }           case 4:                return 0;           default:return 0;       }       printf("------------------------------\n");       printf("1.遍历二叉树:\n");       printf("2.求二叉树独生子女的个数:\n");       printf("3.求二叉树的深度:\n");       printf("4.退出:\n");       printf("------------------------------\n");   }   while(1);   return 0;}

0 0