| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 364 人关注过本帖
标题:二叉树操作~请高手帮我调试一下!
只看楼主 加入收藏
土豆豆jack
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-12-29
结帖率:0
收藏
 问题点数:0 回复次数:2 
二叉树操作~请高手帮我调试一下!
#include "math.h"  
#include "malloc.h"  
#include "stdio.h"  
#include "conio.h"  
#include "stdlib.h"  
#include <queue>  
  
#define stackinitsize 100  
#define OK 1  
#define ERROR 0   
char prelist[stackinitsize];  
char inlist[stackinitsize];  
  
typedef int TElemType ;  
typedef int Status;  
  
  
  
  
       //一一一一一二叉树的二叉链表存储表示一一一一一  
typedef struct  BiTNode{              //二叉树结构体  
     char   data;  
     struct  BiTNode  *lchild,*rchild,*node;   //左右孩子指针  
   }BiTNode,*SElemType,*BiTree;  
  
  
  
typedef struct{  
  //该堆栈的元素是指针类型的  
  //base和top均是指向指针的指针  
  SElemType *base;  
  SElemType *top;  
  int stacksize;  
}sqstack;//堆栈结构  
  
Status InitStack(sqstack &s)//初始化堆栈  
 {  
  s.base=(SElemType*)malloc(100*sizeof(SElemType));  
  if(!s.base) return NULL;  
  s.top=s.base;  
  s.stacksize=100;  
  return OK;  
 }  
  
int StackEmpty(sqstack &s) //栈空判别  
 {return(s.top==s.base); }  
  
Status Pop(sqstack &s,SElemType &e)//弹栈(若栈不为空,删除栈顶元素,用e返回其值)  
 {  if(s.top==s.base)  return ERROR;   
 e=*--s.top;   return OK;}  
  
Status GetTop(sqstack &s,SElemType &e)    //若栈不为空,用e返回栈顶元素  
 { if(s.top==s.base) return ERROR;  
   e=*(s.top-1);  
   return OK;  
 }  
  
Status Push(sqstack &s,SElemType e)//将元素压入堆栈  
 { if(s.top-s.base>=s.stacksize)       //栈满,追加存储空间
{ s.base=(SElemType *)  realloc (s.base,(s.stacksize+10)*sizeof(SElemType));
  if(!s.base) exit (OVERFLOW);  //存储分配失败  
  s.top=s.base+s.stacksize;  
  s.stacksize+=10;  
 }  
 *s.top++ =e;  
 return OK;  
 }  
  
Status  PrintElement(TElemType  e)                                       //应用函数  
       {   //输出元素e的值  
           printf("%2c",e);         
           return  OK;  
 }  
  
  
  
StatusPreOrderCreateBiTree(BiTree&T){     //按先序 次序构造二叉树
  
    //按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树。  
    //构造二叉链表表示的二叉树T.  
    char ch;  
   
    ch=getchar();   
    if(ch==' ') T=NULL;  
     else{  
        if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit (OVERFLOW);  
        T->data=ch;             //生成根结点  
        PreOrderCreateBiTree(T->lchild);//构造左子树  
        PreOrderCreateBiTree(T->rchild);//构造右子树  
   
    }  
      return  OK;  
    }//CreateBiTree  
  
  
  
BiTNode *preintotree(char pre[100],char in[100],int i,int j,int k,int l)        //已知前序、后序序列恢复
二叉树  
{  
  
  
int m;  
BiTNode *p;  
p=(BiTNode*)malloc(sizeof(BiTNode));  
p->data=pre[i];  
m=k;  
while(in[m]!=pre[i])  
    m++ ;  
    if (m==k)p->lchild=NULL;  
       else p->lchild=preintotree(pre,in,i+1,i+m-k,k,m-1);  
    if (m==j)p->rchild=NULL;  
       else p->rchild=preintotree(pre,in,i+m-k+1,j,m+1,l);  
    return p;  
}  
  
  
  
Status  PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e))                      //先序遍历  
       //采用二叉链表存储结构,visit是对数据元素操作的应用函数,  
       //先序遍历二叉树T的递归算法,对每个数据元素调用函数visit。  
        
  
  {  
       if(T)  
       { if (Visit(T->data))  
         if (PreOrderTraverse(T->lchild,Visit))  
             if  (PreOrderTraverse(T->rchild,Visit)) return  OK;  
             return  ERROR;  
       }  
    else  return  OK;  
  
 }//preOrderTraVerse  
   
Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e))                    //中序遍历  
       //采用二叉链表存储结构,visit是对数据元素操作的应用函数,  
       //中序遍历二叉树T的递归算法,对每个数据元素调用函数visit。  
   {  
      if(T){  
             if (InOrderTraverse(T->lchild,Visit))  
             if (Visit(T->data))  
                 if (InOrderTraverse(T->rchild,Visit))   return  OK;  
                 return  ERROR;
      }  
     else  return  OK;  
//    printf("\n");  
      }//preOrderTraVerse  
  
Status  PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e))                   //后序遍历  
       //采用二叉链表存储结构,visit是对数据元素操作的应用函数,  
       //后序遍历二叉树T的递归算法,对每个数据元素调用函数visit。  
   {  
       if(T){  
             if (PostOrderTraverse(T->lchild,Visit))  
             if (PostOrderTraverse(T->rchild,Visit))  
                 if (Visit(T->data)) return  OK;  
                 return  ERROR;  
       }  
    else  return  OK;  
//    printf("\n");  
    }//preOrderTraVerse  
  
  
  
void LevelOrderTranslever(BiTNode *T)            //层序遍
  
{  
    struct node  
    {   
        BiTNode *vec[20];  
        int f,r;                //r为队尾,f为队头  
    }queue;  
    BiTNode *p;  
    p=T;  
    queue.f=0;  
    queue.r=0;  
    if(T)  
        printf("%c ", p->data);  
    queue.vec[queue.r]=p;  
    queue.r=queue.r+1;  
    while(queue.f<queue.r)  
    {  
        p=queue.vec[queue.f];  
        queue.f=queue.f+1;  
        if(p->lchild)  
        {  
            printf("%c ",p->lchild->data);  
            queue.vec[queue.r]=p->lchild;  
            queue.r=queue.r+1;  
        }  
        if(p->rchild)  
        {  
            printf("%c ",p->rchild->data);  
            queue.vec[queue.r]=p->rchild;  
            queue.r=queue.r+1;  
        }  
    }  
    printf("\n");  
}  
  
  
  
Status  Exchange(BiTNode *t)             //交换左右子树  
{  
    BiTNode *temp;  
    if(t)  
    {  
        Exchange(t->lchild);  
        Exchange(t->rchild);  
        temp=t->lchild;  
        t->lchild=t->rchild;  
        t->rchild=temp;      return OK;  
    }  
 return ERROR;  
}   
Status  Leaves_Num(BiTNode *t)                                           //计算叶子结点个
  
 { if(t){ if(t->lchild==NULL && t->rchild==NULL)return OK;  
          return (Leaves_Num(t->lchild)+Leaves_Num(t->rchild));
}
          else return ERROR;  
 }  
  
int a=0;  
void  Branch_Num(BiTNode *t)                                              //计算分支结点
个数  
 {   
  if(t){   
   if(t->lchild!=NULL || t->rchild!=NULL)a++,Branch_Num(t->lchild),Branch_Num(t->rchild) ;  
   }  
 }  
  
Status height(BiTNode *t)                                                //二叉树的高度  
 { if(!t) return ERROR;  
   int hl=height(t->lchild );  
   int hr=height(t->rchild );  
   if(hl>hr)return ++hl;  
   else return ++hr;  
 }  
  
/*BiTNode  *Search(BiTNode *T,char i)    //查询结点  
 { if(T!=NULL)  
   { if(T->contents==i)return 1;  
     if(T->lchild !=NULL)  
          if(T->lchild ->contents ==i)return 2;  
     if(T->rchild !=NULL)  
          if(T->rchild ->contents ==i)return 3;  
     Search(T->lchild,i);  
     Search(T->rchild,i);  
   }  
 }  
BiTNode   *   Search(BiTNode *T,int i)              //按给定值在二叉排序树中查询   
{   
 BiTNode   *   p;   
 if   (T   ==   NULL) p=NULL;   
 else { if   (i   ==   T-> data) p   =   T;   
    else   if   (i >   T-> data) p = Search(i, T-> rchild);   
      else p=Search(i, T-> lchild);   
       return   p;   
   }
  
void Search_bst(BiTNode *T)  
{int s;  
 BiTNode *p;  
 char[5];  
 printf("\n");  
 printf( "请输入要查询的结点值: ");   
scanf( "%d ",&s);   
if  (   s!=   0)   
    {p=Search(T,s);  
     if(p=NULL)printf( "该结点值不存在!\n ");  
     else printf( "该结点值存在!\n ");   
    }  
}           
           
           
/* { if(!T) return ERROR;  
     else if(elem==T->data)return OK;  
             else if(elem%2==0) Search(T->rchild,elem,T,p);  
                     else Search(T->rchild,elem,T,p);  
   
 }*/  
  
/*Status Insert(BiTNode *T,char i,TElemType e)                    //插入结点  
 {   
  BiTNode *s;  
  if(!s)  
  { s=(BiTNode *)malloc(sizeof(BiTNode));  
    s->node->contents =e;s->lchild=s->rchild=NULL;  
    if(Search(T,i)==1)T->node =s;  
    if(Search(T,i)==2)T->lchild=s;  
       else if(Search(T,i)==3)T->rchild=s;  
    return OK;  
  }  
  else return ERROR;  
 }  
  
  
/*void Delete(BiTNode *T,char i)//删除结点  
 { if(T)  
        if(T->node==i)  
           {delete node;node=NULL;printf("已删除结点,当前树为空");}  
 }     
   
 BiTree q,s;
 if(!p->rchild)  
 { q=p;  
   p=p->lchild;  
   free(q);  
  }  
  else if(!p->lchild)  
 {  
  q=p;  
  p=p->rchild;  
  free(q);  
 }  
  else {  
  
    q=(*p);  
    s=(*p)->l;  
    while(s->r) {q=s; s=s->r;}  
    (*p)->data=s->data;  
    if(q!=(*p) ) q->r=s->l;  
    else q->l=s->l;  
    free(s);  
      
  
    q=s=p->lchild;  
    while(s->rchild) s=s->rchild;  
    s->rchild=p->rchild;  
    free (p);  
    p=q;  
  
  }  
}*/  
  
  
/*Status DeleteBST(BiTNode *T,TElemType elem)//删除树  
{  
  if (!T){return ERROR;}  
  else{  
       if  (elem==T->data) Delete(T);  
        else if ( elem<T->data) DeleteBST( T->lchild, elem);  
            else DeleteBST( T->rchild,elem);  
       return OK;  
  }  
}*/  
  
  
  
Status  InorderTraverseNoRecursion(BiTree T,Status(*Visit)(TElemType e))       //中序非递归算法-------1  
           
    //采用二叉链表存储结构,visit是对数据元素操作的应用函数。  
    //中序遍历二叉树T的非递归算法,对每个数据元素调用函数visit。  
   {sqstack s;  
    BiTree p;  
    InitStack(s);p=T;   
    while(p||!StackEmpty(s))  
      {  
        if(p){ Push(s,p);p=p->lchild;}//根指针进栈,遍历左子树  
               else{       //根指针退栈,访问根结点,遍历右子树  
                    Pop(s,p);  
                    if(!Visit(p->data))  return  ERROR;  
                       p=p->rchild;  
               }//else  
    }//while  
   return  OK;  
 }//InorderTraVerse1  
  
/*Status  InorderTraverseNoRecursion2(BiTree T,Status(*Visit)(TElemType e))      ////中序非递归算法 -------2  
           
    //采用二叉链表存储结构,visit是对数据元素操作的应用函数。  
    //中序遍历二叉树T的非递归算法,对每个数据元素调用函数visit。  
   {sqstack s;  
    BiTree p;  
    InitStack(s);Push(s,T);   
    while(!StackEmpty(s))  
      {  
       while(GetTop(s,p)&&p) Push(s,p->lchild);//向左走到尽头  
       Pop(s,p);                               //空指针退栈  
       if(!StackEmpty(s)) {                    //访问结点,向右一步  
       Pop(s,p);  
       if(!Visit(p->data))  return  ERROR;  
       Push(s,p->rchild);  
                           }//if  
      }//while  
    return  OK;  
  }//InorderTraVerse1  
*/  
  
void Disptree(BiTNode *T)                                //输出二叉树  
{  
    if(T)  
    {  
        printf("%c",T->data);      
        if(T->lchild || T->rchild)  
        {  
            printf("(");  
            Disptree(T->lchild);  
            if(T->rchild)  
                printf(",");  
            Disptree(T->rchild);  
            printf(")");  
        }  
    }  
}  
  
  
  
  
void main()  
{  
  BiTree t;  
  int i,n;  
grade:while(1)  
  {   
    printf("\n\n");   
    printf("        ★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");  
    printf("        ★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");  
    printf("        ★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");  
    printf("        ★★★                                            ★★★\n");  
    printf("        ★★★      2.按先序次序构造二叉树                ★★★\n");  
    printf("        ★★★      3.先序遍历、中序遍历、后序遍历        ★★★\n");  
    printf("        ★★★      4.层序遍历                            ★★★\n");  
    printf("        ★★★      5.非递归中序遍历                      ★★★\n");  
    printf("        ★★★      6.二叉树高度                          ★★★\n");  
    printf("        ★★★      7.二叉树叶子结点个数                  ★★★\n");  
    printf("        ★★★      8.二叉树分支结点个数                  ★★★\n");  
    printf("        ★★★      9.二叉树中所有结点的左右子树交换      ★★★\n");  
    printf("        ★★★      r.返回主菜单                          ★★★\n");  
    printf("        ★★★      0.退出程序                            ★★★\n");  
    printf("        ★★★                                            ★★★\n");  
    printf("        ★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");  
    printf("        ★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");
    printf("        ★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");  
    while(1){  
    printf("\n请输入您的操作序号:  ");  
    char d=getche();  
    switch(d)  
    { case '0':printf("\n    程序运行结束,按任意键退出!\n\n");exit(0);break;  
      case '1':printf("\n请输入前序序列:\n");
               getch();  
                    for(n=0;;n++)//prelist[n]=getchar();  
                    {  
                      scanf("%c",&prelist[n]);  
                      if(prelist[n-1]=='#') break;  
                    }  
               printf("\n请输入中序序列:");  
                     for(n=0;;n++)//inlist[n]=getchar();  
                    {  
                      scanf("%c",&inlist[n]);  
                      if(prelist[n-1]=='#') break;  
                    }  
               t=preintotree(prelist,inlist,0,strlen(prelist)-1,0,strlen(inlist)-1);  
               printf("\n恢复后的后序序列为:");  
               PostOrderTraverse(t,PrintElement);  
  
               break;  
      case '2':printf("\n请按先序遍历输入二叉树(当左右子树为空时用空格输入)
\n");PreOrderCreateBiTree(t);break;  
      case '3':printf("\n 该二叉树的先序遍历为:");PreOrderTraverse(t,PrintElement);  
               printf("\n    该二叉树的中序遍历为:
");InOrderTraverse(t,PrintElement);//Disptree(t);  
               printf("\n 该二叉树的后序遍历为:");PostOrderTraverse(t,PrintElement);  
               printf("\n    该二叉树的树状形态为:");Disptree(t);printf("\n");break;  
      case '4':printf("\n    该二叉树的层序遍历为:");LevelOrderTranslever(t);break;  
      case '5':printf("\n    该二叉树的中序遍历为(用非递归调用):
");InorderTraverseNoRecursion(t,PrintElement);printf("\n");break;  
      case '6':printf("\n    该二叉树的高度为:%d",height(t));printf("\n");break;  
      case '7':printf("\n    该二叉树的叶子结点个数为:%d",Leaves_Num(t));printf("\n");break;  
      case '8':Branch_Num(t);printf("\n    该二叉树的分支结点个数
为:%d",a);printf("\n");break;  
      case '9':Exchange(t);printf("\n    该二叉树左右子树交换后的先序遍历为:");  
                 PreOrderTraverse(t,PrintElement);printf("\n    该二叉树的树状形态为:
");Disptree(t);printf("\n");break;  
      case 'r':goto grade;  
      default:printf("    输入无效,请重新选择操作!\n");  
    }  
}  
}   
}
搜索更多相关主题的帖子: include 二叉树 结构体 左右 
2012-01-04 16:34
土豆豆jack
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-12-29
收藏
得分:0 
我太笨了啊!
2012-01-04 16:36
土豆豆jack
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2011-12-29
收藏
得分:0 
头都大了啊!
2012-01-04 16:38
快速回复:二叉树操作~请高手帮我调试一下!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034045 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved