您的位置:首页 > 理论基础 > 数据结构算法

/* 创建二叉树 ----> 装入数据,---->遍历---> 显示 --->销毁*/

2005-04-15 20:46 337 查看
/*有错误 再想对策*/
/* twoTree.c*/
/* 创建二叉树  ----> 装入数据,---->遍历---> 显示 --->销毁*/#include <stdio.h>#include <malloc.h>#ifndef DEBUG#define DEBUG/********                          **********************//*链栈, 判断 栈是否空,压栈,出栈*//*----------------------------------------------*/typedef int DataType;typedef DataType elementTypt;typedef struct Node{       DataType data;       struct Node  *LChild;       struct Node  *RChild;       struct Node  *Root;}Node;/*树的数据结构*//*==================================----*/typedef struct stackNode{       elementTypt data;       struct stackNode * next;}stackNode;/* 栈的数据结构*/void TInitstack( stackNode * Top )/*初始化栈*/{       Top = ( stackNode *) malloc ( sizeof ( stackNode ) );       Top -> next = NULL;       return;}int isEmpty( stackNode * Top  )/* 是否空*/{       return ( Top -> next == NULL );}int TPush( stackNode * Top , elementTypt data  )/*将元素 data 压入栈Top中,出错返回 1*/{       stackNode * Temp;       Temp = ( stackNode * ) malloc( sizeof( stackNode ) );       if( !Temp )       {              return 1;       }/*空间分配失败返回*/       Temp -> data = data ;       Temp -> next = Top -> next ;       Top  -> next = Temp;       return 0;}int TPop( stackNode * Top , elementTypt * ptr ){       stackNode * Temp;       Temp = Top -> next ;       if( !Temp )       {              return 1;       }/*栈空返回 1 */       Top -> next = Temp -> next ;       *ptr = Temp -> data ;       free( Temp );       return 0 ;}/* creat tree */void Initiate( Node  *root )/*初始化为空树*/{       root = ( Node * ) malloc( sizeof( Node ) );       root -> LChild = root -> RChild = NULL;}void Creat( Node *root , DataType data  ){       if( root )        {              root -> data = data ;              return ;       }       root = ( Node * ) malloc( sizeof( Node ) );       root -> data = data ;       root -> LChild = root -> RChild = NULL;}void Destory( Node *root )/* 销毁二叉数 root */{       stackNode *s ;       Node *pre = root;       TInitstack( s );       while( pre != NULL || !isEmpty(s) )       {              if( pre )              {                            TPush( s , pre -> data );                     pre = pre -> LChild;              }              else              {                     TPop( s ,&( pre -> data) );                     if( !pre -> RChild )                            /*  free 条件                             !(pDel -> right && ! p->left) */                     {                            Node *pDel = pre ;                            free ( pDel );                            TPop( s , &( pre -> data ) );                     }                     else                     {                            pre = pre -> RChild;                     }              }       } }/*对称编码 防止 漏标识符 */void  Insert( Node *root , DataType data )/* 降顺序二叉数装入数据,左子树<右子树*/{       Node *p = root;       if( root != NULL )       {              Creat( root , data ) ;              return ;       }              while( p )       {              if( data < (p -> data)  )               {                     p = p -> LChild;              }              else              {                     p = p -> RChild;              }              /*相等的 将装数据到右孩子 */       }            Creat( p , data );}void CreatTree( Node *root , DataType data ,                        Node * LChild , Node *RChild )                        /* 生成树结构:把节点连起来*/{              root -> LChild = LChild ;       root -> RChild = RChild;       root -> data   = data;       return;}void Visit( Node * p ){       printf("%d :", p -> data );       return;}void InOrder( Node * root )/*中序遍历二叉树*/{       /* add code */       stackNode * S ;       Node *p = root ;        TInitstack( S );              while(( p != NULL )|| (! isEmpty( S )) )       {              if( p != NULL )/*根指针进栈*/              {                      TPush( S , (p -> data) );                     p = p -> LChild;              }              else              {                     TPop( S , &( p -> data ) );                     Visit ( p  );                     p = p -> RChild;              }        }       return;       }#endif DEBUGvoid main(){       Node *Root ;       int a=0. ch=0, i= 0;       printf("InPut Root Data : ");       scanf("%d",&a);       getchar();      Creat( Root ,  a );       while( ch != '$' )       {             ++i ;              printf("Input  %d Data : ", i);              Insert( Root , ch );              ch = getchar() ;       }       getchar();       InOrder( Root );       Destory( Root );       return;}============================/*       twoTree.cpp在 c++环境编译 ! 创建二叉树  ----> 装入数据,---->遍历---> 显示 --->销毁*都换用递归实现了 非递归实现还不怎么熟悉所以就*/#include <iostream.h>#ifndef DEBUG#define DEBUGtypedef int DataType;typedef struct Node{       DataType        data;       struct Node  *LChild;       struct Node  *RChild;}Node;/*树的数据结构*//////////////////////////////////////////////////////////////Node * Initiate()/*初始化为空树*/{       Node   *root = 0;       return   root ;}////////////////////////////////////////////////////////////////Node * Creat(  DataType data  ) /*建节点*/{       Node   * Temp   = new Node ;       Temp -> data     = data ;       Temp -> LChild = 0 ;        Temp -> RChild = 0;       return Temp ;} /************************************************/void  Insert( Node *&root , DataType data )//在c下不能这样 Node *&root/* 降顺序二叉数装入数据,左子树<右子树*/{       Node *p = Creat( data );       if( !root  )       {              root = p;                    }          else if( p->data < root->data )          {                 Insert ( root->LChild , p->data );          }          else           {                 Insert ( root->RChild , p->data );           } /*相等的 将装数据到右孩子 */        }/****************************************************/ void PrintTree(Node * root) /*递归中序遍历 ---> 显示从小到大*/ {       if( !root )  return ;       PrintTree(root->LChild);             cout<< root->data <<"  :";      PrintTree( root->RChild );      return ;}/*********************************************************/void  FreeTree(Node * root){       if( !root ) return;       FreeTree(root -> LChild);       FreeTree(root -> RChild);       delete root;//跟节点要最后删!} #endif DEBUG///测试代码////////////void main(){         int a;       Node *Root = Initiate() ;       cout<<" -1 to exit: "<<endl;       cin>>a;                    while( (a != -1)&&cin.good() )                 //遇到非法输入同样退出循环       {                    Insert( Root ,  a );                       cin>>a ;                               }          if(!cin.good())                     //输出错误信息         {                     cout<<" the type is error ! "<<endl;         }          PrintTree(Root);          cout<<" ok ? "<<endl;           FreeTree(Root);//销毁树 防止内存泄漏          return;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐