[C++] 二叉树操作算法(二叉树初始化、深度、建立、输出等) →→→→→进入此内容的聊天室

来自 , 2020-06-09, 写在 C++, 查看 108 次.
URL http://www.code666.cn/view/2647c1db
  1. #include<iostream.h>
  2. #include<STRSTREAM.H>
  3. typedef char elemtype;
  4. struct btreenode
  5. {
  6.         elemtype data;
  7.         btreenode *lchild;
  8.         btreenode *rchild;
  9. };
  10. void initbtree ( btreenode *&bt )
  11. { bt=NULL;}
  12.  
  13. void precrttree ( btreenode *&bt )
  14. {
  15.         char ch;
  16.         cin>>ch;
  17.         if ( ch=='#' )
  18.                 bt=NULL;
  19.         else
  20.         {
  21.                 bt=new btreenode;
  22.                 bt->data=ch;
  23.                 precrttree ( bt->lchild );
  24.                 precrttree ( bt->rchild );
  25.         }
  26. }
  27.  
  28. void crtbtree ( btreenode *&bt,char *a )
  29. {
  30.         char ch;
  31.         btreenode *s[20];
  32.         int top=-1;
  33.         bt=NULL;
  34.         btreenode *p;
  35.         int k;
  36.         istrstream ins ( a );
  37.         ins>>ch;
  38.         while ( ch!='@' )
  39.         {
  40.                 switch ( ch )
  41.                 {
  42.                 case'(':
  43.                         top++;
  44.                         s[top]=p;
  45.                         k=1;
  46.                         break;
  47.                 case')':
  48.                         top--;
  49.                         break;
  50.                 case',':
  51.                         k=2;
  52.                         break;
  53.                 default:
  54.                         p=new btreenode;
  55.                         p->data=ch;
  56.                         p->lchild=p->rchild=NULL;
  57.                         if ( bt==NULL )
  58.                                 bt=p;
  59.                         else
  60.                         {
  61.                                 if ( k==1 )  s[top]->lchild=p;
  62.                                 else s[top]->rchild=p;
  63.                         }
  64.                 }
  65.                 ins>>ch;
  66.         }
  67. }
  68.  
  69. int btreeempty ( btreenode *bt )
  70. { return bt==NULL;}
  71.  
  72. void preorder ( btreenode *bt )
  73. {
  74.         if ( bt!=NULL )
  75.         {
  76.                 cout<<bt->data<<' ';
  77.                 preorder ( bt->lchild );
  78.                 preorder ( bt->rchild );
  79.         }
  80. }
  81.  
  82. void inorder ( btreenode *bt )
  83. {
  84.         if ( bt!=NULL )
  85.         {
  86.                 inorder ( bt->lchild );
  87.                 cout<<bt->data<<' ';
  88.                 inorder ( bt->rchild );
  89.         }
  90. }
  91.  
  92. void postorder ( btreenode *bt )
  93. {
  94.         if ( bt!=NULL )
  95.         {
  96.                 postorder ( bt->lchild );
  97.                 postorder ( bt->rchild );
  98.                 cout<<bt->data<<' ';
  99.         }
  100. }
  101.  
  102. void levorder ( btreenode *bt )
  103. {
  104.         btreenode *q[30];
  105.         int front=0,rear=0;
  106.         btreenode *p;
  107.         if ( bt!=NULL )
  108.         {
  109.                 rear= ( rear+1 ) %30;
  110.                 q[rear]=bt;
  111.         }
  112.         while ( front!=rear )
  113.         {
  114.                 front= ( front+1 ) %30;
  115.                 p=q[front];
  116.                 cout<<p->data<<' ';
  117.                 if ( p->lchild!=NULL )
  118.                 {
  119.                         rear= ( rear+1 ) %30;
  120.                         q[rear]=p->lchild;
  121.                 }
  122.                 if ( p->rchild!=NULL )
  123.                 {
  124.                         rear= ( rear+1 ) %30;
  125.                         q[rear]=p->rchild;
  126.                 }
  127.         }
  128. }
  129.  
  130. int btreedepth ( btreenode *bt )
  131. {
  132.         if ( bt==NULL )
  133.                 return 0;
  134.         else
  135.         {
  136.                 int dep1=btreedepth ( bt->lchild );
  137.                 int dep2=btreedepth ( bt->rchild );
  138.                 if ( dep1>dep2 )
  139.                         return dep1+1;
  140.                 else
  141.                         return dep2+1;
  142.         }
  143. }
  144.  
  145. int btreecount ( btreenode *bt )
  146. {
  147.         if ( bt==NULL )
  148.                 return 0;
  149.         else
  150.                 return btreecount ( bt->lchild ) +btreecount ( bt->rchild ) +1;
  151.  
  152. }
  153.  
  154. int btreeleafcount ( btreenode *bt )
  155. {
  156.         if ( bt==NULL )
  157.                 return 0;
  158.         else if ( bt->lchild==NULL&&bt->rchild==NULL )
  159.                 return 1;
  160.         else return btreeleafcount ( bt->lchild ) +btreeleafcount ( bt->rchild );
  161. }
  162.  
  163. void printbtree ( btreenode *bt )
  164. {
  165.         if ( bt==NULL )
  166.                 return;
  167.         else
  168.         {
  169.                 cout<<bt->data;
  170.                 if ( bt->lchild!=NULL||bt->rchild!=NULL )
  171.                 {
  172.                         cout<<'(';
  173.                         printbtree ( bt->lchild );
  174.                         if ( bt->rchild!=NULL )
  175.                                 cout<<',';
  176.                         printbtree ( bt->rchild );
  177.                         cout<<')';
  178.                 }
  179.         }
  180. }
  181.  
  182. void clearbtree ( btreenode *&bt )
  183. {
  184.         if ( bt!=NULL )
  185.         {
  186.                 clearbtree ( bt->lchild );
  187.                 clearbtree ( bt->rchild );
  188.                 delete bt;
  189.                 bt=NULL;
  190.         }
  191. }
  192.  
  193. void main()
  194. {
  195.         btreenode *bt;
  196.         initbtree ( bt );
  197.         char b[50];
  198.         int tag;
  199.         cout<<"1.pre order create btree"<<endl;
  200.         cout<<"2.glist create btree"<<endl;
  201.         cout<<"input selecte 1 or 2:";
  202.         cin>>tag;
  203.         if ( tag==2 )
  204.         {
  205.                 cout<<"input @ end glist:"<<endl;
  206.                 cin.getline ( b,sizeof ( b ) );
  207.                 crtbtree ( bt,b );
  208.         }
  209.         else
  210.         {
  211.                 cout<<"input pretree and '#':"<<endl;
  212.                 precrttree ( bt );
  213.         }
  214.         printbtree ( bt );
  215.         cout<<endl;
  216.         cout<<"pre order:";
  217.         preorder ( bt );
  218.         cout<<endl;
  219.         cout<<"in order:";
  220.         inorder ( bt );
  221.         cout<<endl;
  222.         cout<<"post order:";
  223.         postorder ( bt );
  224.         cout<<endl;
  225.         cout<<"level order:";
  226.         levorder ( bt );
  227.         cout<<endl;
  228.         cout<<"btree depth is:";
  229.         cout<<btreedepth ( bt ) <<endl;
  230.         cout<<"btree node num is:";
  231.         cout<<btreecount ( bt ) <<endl;
  232.         cout<<"btree leaf node num is:";
  233.         cout<<btreeleafcount ( bt ) <<endl;
  234.         clearbtree ( bt );
  235. }
  236.  

回复 "二叉树操作算法(二叉树初始化、深度、建立、输出等)"

这儿你可以回复上面这条便签

captcha