ツリー関連アルゴリズム



  
  
  
  
  1. #ifndef _TREE_H 
  2. #define _TREE_H 
  3. #define MAXSIZE 10 
  4. #define MaxSize 10 
  5. #define M 10 
  6. //      
  7.   
  8. typedef int ElemType; 
  9. typedef struct 
  10.     ElemType data; 
  11.     int pos; 
  12. }STree[MaxSize]; 
  13.  
  14. //  
  15.  
  16. typedef struct  tnode 
  17.     ElemType data; 
  18.     struct tnode *child[M];  //M , ,  
  19. }CTree; 
  20.  
  21.  
  22. //  
  23. typedef struct cbnode 
  24.     ElemType data; 
  25.     struct cbnode *child; 
  26.     struct cbnode *brother; 
  27. }CBTree; 
  28.  
  29.  
  30.  
  31. typedef struct node 
  32.     char data; 
  33.     struct node *left; 
  34.     struct node *right; 
  35. }BTNode; 
  36.  
  37.   
  38.  
  39. #endif 
  40.  
  41.  
  42. #include <stdio.h> 
  43. #include "stdlib.h" 
  44. #include "tree.h" 
  45.  
  46. // ,      
  47.  
  48.  
  49.  
  50. //  
  51.  void PreOrder(BTNode *b) 
  52.  { 
  53.      if(b != NULL) 
  54.      { 
  55.         printf("%d  ",b->data); 
  56.         PreOrder(b->left); 
  57.         PreOrder(b->right); 
  58.      } 
  59.  } 
  60.  
  61.  void PreOrder2(BTNode *b) 
  62.  { 
  63.     BTNode *st[MAXSIZE], *p; 
  64.     int top = -1; 
  65.     if(b != NULL) 
  66.     { 
  67.         top++; 
  68.         st[top]=b;     //      
  69.         while(top>-1) 
  70.         { 
  71.             p=st[top]; 
  72.             top--; 
  73.             printf("%d  ",p->data);   // ,  
  74.             if(p->right != NULL)      // ,    
  75.             { 
  76.                 top++; 
  77.                 st[top]=p->right; 
  78.             } 
  79.             if(p->left != NULL)       // ,   ,  
  80.             { 
  81.                 top++; 
  82.                 st[top]=p->left; 
  83.             } 
  84.             printf("
    "
    ); 
  85.         } 
  86.     } 
  87.  } 
  88.  
  89.  //  
  90.  void InOrder(BTNode *b) 
  91.  { 
  92.     if(b != NULL) 
  93.     { 
  94.         InOrder(b->left); 
  95.         printf("%d  ",b->data); 
  96.         InOrder(b->right); 
  97.     } 
  98.  } 
  99.  
  100. void InOrder2(BTNode *b) 
  101.      BTNode *st[MAXSIZE], *p; 
  102.      int top=-1; 
  103.      if(b != NULL) 
  104.      { 
  105.          p=b; 
  106.         while(top>-1 || p!=NULL) 
  107.         { 
  108.             while(p != NULL)        //    
  109.             { 
  110.                 top++; 
  111.                 st[top]=p->left; 
  112.                 p=p->left; 
  113.             } 
  114.             if(top>-1) 
  115.             { 
  116.                 p=st[top];          // ,  
  117.                 top--; 
  118.                 printf("%d  ",p->data); 
  119.                 p=p->right;             //  
  120.             } 
  121.         } 
  122.      } 
  123. }//   , , , , 
  124. // , , ,  
  125. //  
  126.  
  127.  
  128. //  
  129.  
  130. void PostOrder(BTNode *b) 
  131.     if(b != NULL) 
  132.     {        
  133.         PostOrder(b->left); 
  134.         PostOrder(b->right); 
  135.         printf("%d  ",b->data); 
  136.     } 
  137.  
  138. void PostOrder2(BTNode *b) 
  139.     BTNode *st[MAXSIZE], *p; 
  140.     int top=-1,flag=1; 
  141.     if(b!=NULL) 
  142.     { 
  143.         do 
  144.         { 
  145.             while(b!=NULL)      // b  
  146.             { 
  147.                 top++; 
  148.                 st[top]=b; 
  149.                 b=b->left; 
  150.             } 
  151.             p=NULL;            //p  
  152.             flag=1; 
  153.             while(flag && top!=-1) 
  154.             { 
  155.                 b=st[top];        //  
  156.                 if(b->right == p)   // , *b 
  157.                 { 
  158.                      
  159.                     top--; 
  160.                     printf("%d  ",b->data); 
  161.                     p=b;             //p  
  162.                 }else 
  163.                 { 
  164.                     b=b->right; 
  165.                     flag=0; 
  166.                 } 
  167.             } 
  168.  
  169.         }while(top!=-1); 
  170.     } 
  171. }      // ,p , p!=null  , 
  172. //  
  173.  
  174.  
  175. void CreateTree(BTNode * b, char *str) 
  176.     BTNode *st[MAXSIZE], *p=NULL;    // st    ,  
  177.     int top=-1, k=1, j=0; 
  178.     char ch=str[j]; 
  179.     b=NULL; 
  180.     while(ch != '\0'
  181.     { 
  182.         switch(ch) 
  183.         { 
  184.             case '(' : 
  185.                 top++; k=1; st[top]=p; break;   //    '('  , k=1 
  186.             case ')' :  
  187.                 top--; break;                 //      
  188.             case ' ' : 
  189.                 break
  190.             case ',' : 
  191.                 k=2; break;                  //    k=2  
  192.             default : 
  193.                 p=(BTNode *)malloc(sizeof(BTNode)); 
  194.                 if(p == NULL) return ; 
  195.  
  196.                 p->data=ch; 
  197.                 p->left=NULL; 
  198.                 p->right=NULL; 
  199.  
  200.                 if(b == NULL) b=p; 
  201.                 else  
  202.                     switch(k) 
  203.                 { 
  204.                     case 1 : 
  205.                         st[top]->left=p;break
  206.                     case 2 : 
  207.                         st[top]->right=p; break
  208.                 } 
  209.                 break;                           //   , (b) null, , 
  210.                                   //     ,     p    ‘(’‘)’ , 。 
  211.  
  212.         } 
  213.         ch=str[++j]; 
  214.     } 
  215.  
  216. //  
  217. BTNode *FindNode(BTNode *root,char e) 
  218.      BTNode *p; 
  219.      if(root == NULL) return NULL; 
  220.      else if(root->data == e) return root;  //  
  221.      else  
  222.      { 
  223.         p = FindNode(root->left,e);           // , ,  
  224.         if(p == NULL) return FindNode(root->right,e);  //   ,  
  225.         else return p;         //  
  226.      } 
  227. // b x  
  228. void NodeLevel2(BTNode *b, char x, int &h, int ih) 
  229.     if(b == NULL) h = 0; 
  230.     else if(b->data == x) h = ih; 
  231.     else  
  232.     { 
  233.         NodeLevel2(b->left,x,h,ih+1); 
  234.         if(h == 0)  
  235.         { 
  236.             NodeLevel2(b->right,x,h,ih+1); 
  237.         } 
  238.     } 
  239.  
  240. // , ,  , , ,    
  241.  
  242.  
  243.  
  244.  
  245. //  
  246.  
  247. int BTNodeDepth(BTNode *b) 
  248.     int lDepth, rDepth; 
  249.     if(b == NULL) return 0; 
  250.     else  
  251.     { 
  252.         lDepth = BTNodeDepth(b->left); 
  253.         rDepth = BTNodeDepth(b->right); 
  254.         return (lDepth > rDepth) ? lDepth+1 : rDepth+1; 
  255.     } 
  256.  
  257.  
  258. //  
  259.  
  260.  void DispBTNode (BTNode *b) 
  261.  { 
  262.      if(b != NULL) 
  263.      { 
  264.         printf("%c",b->data);                //  
  265.         if(b->left  != NULL || b->right != NULL) 
  266.         { 
  267.             if(b->left != NULL) 
  268.             { 
  269.                 printf("(");                      // , '('   
  270.                 DispBTNode(b->left); 
  271.             } 
  272.             if(b->right != NULL)            //   ‘,’ 
  273.                 printf(","); 
  274.  
  275.             DispBTNode(b->right); 
  276.             printf(")"); 
  277.              
  278.         } 
  279.      } 
  280.  } 
  281.  
  282.  
  283.  //  
  284.  void *CreateBT1(char *pre, char *in, int n) 
  285.  { 
  286.     BTNode *s; 
  287.     char *p; 
  288.     int k; 
  289.     if(n<0) return NULL; 
  290.     s=(BTNode *)malloc(sizeof(BTNode)); 
  291.     s->data = *pre; 
  292.     for(p=in; p<in+n; p++) 
  293.         if(*pre == *p) break
  294.      
  295.     k=p-in; 
  296.     s->left = CreateBT1(pre+1,in,k); 
  297.     s->right = CreateBT1(pre+k+1,p,n-k-1); 
  298.     return s; 
  299.  } 
  300.  
  301.  //  k   
  302.  char PreNode (BTNode *b, int k, int n) 
  303.  { 
  304.     char ch; 
  305.     if(b == NULL) return ' '
  306.     if(n == k) return b->data; 
  307.     ch = PreNode(b->left,k,n+1); 
  308.     if(ch != ' ' ) return ch; 
  309.     return PreNode(b->right,k,n+1); 
  310.  } 
  311.  
  312.  char PreNode2(BTNode *b, int k) 
  313.  { 
  314.     BTNode *st[MAXSIZE], *p; 
  315.     int top=-1, n=0; 
  316.     if(b != NULL) 
  317.     { 
  318.         top++; 
  319.         st[top]=b;           //   
  320.         while(top > -1) 
  321.         { 
  322.             p=st[top]; 
  323.             top--;                 //  
  324.             n++; 
  325.             if(n == k) printf("%c ,%d  ",p->data,n);   //  
  326.             if(p->right != NULL)        //  
  327.             { 
  328.                 top++; 
  329.                 st[top]=p->right; 
  330.             } 
  331.             if(p->left != NULL)    //  
  332.             { 
  333.                 top++; 
  334.                 st[top]=p->left; 
  335.             }        
  336.         } 
  337.         printf("
    "
    ); 
  338.     } 
  339.     return ' '
  340.  } 
  341. //   ,  {  , ,  ,  } 
  342.  
  343.  
  344.  
  345.  //  k   
  346.  char InNode(BTNode *b, int k, int  n, char  ch) 
  347.  { 
  348.     if(b != NULL) 
  349.     { 
  350.         InNode(b->left ,k,n,ch); 
  351.         printf("%c  %d  ",b->data, n); 
  352.         if(n == k) ch=b->data; 
  353.         n++; 
  354.         InNode(b->right,k,n,ch); 
  355.     } 
  356.  } 
  357.  
  358.  
  359. char InNode2(BTNode *b, int k) 
  360.     BTNode *st[MAXSIZE], *p; 
  361.     int top=-1, n=0; 
  362.     if(b != NULL) 
  363.     { 
  364.         p=b; 
  365.         while(p != NULL || top > -1) 
  366.         { 
  367.             while(p != NULL)   //    
  368.             { 
  369.                 top++; 
  370.                 st[top]=p; 
  371.                 p=p->left; 
  372.             } 
  373.             if(top > -1)     //    
  374.             { 
  375.                 p=st[top]; 
  376.                 top--; 
  377.                 n++;           //   
  378.                 if(n == k)  return p->data;      //   n==k  ,  
  379.                 p=p->right;                       //    
  380.             } 
  381.         } 
  382.         printf("
    "
    ); 
  383.     } 
  384.     return ' '
  385.  
  386. //   , , ,   
  387.  
  388. //  k   
  389. void PostNode(BTNode *b, int k, int n, char ch) 
  390.      
  391.  
  392.  
  393. void  PostNode2(BTNode *b,int k) 
  394.      
  395.   
  396.  
  397.  
  398. //     , ,  
  399. // ,  
  400.  
  401.  
  402.  
  403. //  
  404. void TravLevel(BTNode *b) 
  405.     BTNode *st[MAXSIZE]; 
  406.     int rear=0, front=0; 
  407.     if(b != NULL) 
  408.     { 
  409.         printf("%c  ",b->data); 
  410.         rear ++; 
  411.         st[rear]=b;                                 //  
  412.  
  413.         while(rear != front)           //  
  414.         { 
  415.             front = (front+1)%MAXSIZE; 
  416.             b = st[front];                  //   front  , ,  
  417.             if(b->left != NULL)            // , ,  
  418.             { 
  419.                 printf("%c  ",b->left->data); 
  420.                 rear = (rear + 1)% MAXSIZE; 
  421.                 st[rear]=b->left; 
  422.             }  
  423.             if(b->right != NULL)        // , ,  
  424.             { 
  425.                 printf("%c  ",b->right->data); 
  426.                 rear = (rear +1)%MAXSIZE; 
  427.                 st[rear] = b->right; 
  428.             } 
  429.         } 
  430.         printf("
    "
    ); 
  431.     } 
  432. //      ,      
  433.  
  434.  
  435. //  
  436.  
  437. int digui(BTNode *st1[],int front1, int rear1, int max) 
  438.     BTNode *st2[MAXSIZE], *temp; 
  439.     int front2 = 1, rear2 = 1; 
  440.      
  441.     while(front1 <= rear1) 
  442.     { 
  443.         temp = st1[front1]; 
  444.         if(temp->left != NULL) 
  445.         { 
  446.             st2[rear2] = temp->left; 
  447.             rear2++; 
  448.         } 
  449.         if(temp->right != NULL) 
  450.         { 
  451.             st2[rear2] = temp->right; 
  452.             rear2++; 
  453.         } 
  454.  
  455.         front1++; 
  456.     }    
  457.     if(--rear2 > max)    
  458.         max = rear2; 
  459.     if(front2 == rear2 == 1) return max;  
  460.     digui(st2,1,rear2,max); 
  461.  
  462. int TreeWeight(BTNode *b) 
  463.     BTNode *st[MAXSIZE]  ; 
  464.     st[1] = b ; 
  465.     return digui(st,1,1,1);   
  466.  
  467. int BTWidth(BTNode *b) 
  468.     struct  
  469.     { 
  470.         int lno;             //    
  471.         BTNode *p; 
  472.     }qu[MAXSIZE]; 
  473.  
  474.  
  475.     int front, rear; 
  476.     int lnum, max, i, n; 
  477.     front = rear = 0; 
  478.     if(b != NULL) 
  479.     { 
  480.         rear++; 
  481.         qu[rear].p = b; 
  482.         qu[rear].lno = 1;                //  
  483.  
  484.         while(rear != front) 
  485.         { 
  486.             front++; 
  487.             b = qu[front].p; 
  488.             lnum = qu[front].lno;              // ,   
  489.             if(b->left != NULL) 
  490.             { 
  491.                 rear ++; 
  492.                 qu[rear].p = b->left; 
  493.                 qu[rear].lno = lnum +1; 
  494.             } 
  495.             if(b->right != NULL) 
  496.             { 
  497.                 rear ++; 
  498.                 qu[rear].p = b->right; 
  499.                 qu[rear].lno = lnum +1; 
  500.             } 
  501.         } 
  502.         printf(" :
    "
    ); 
  503.         for(i=0; i<rear; i++) 
  504.             printf(" %c ,%d 
    "
    ,qu[i].p->data, qu[i].lno); 
  505.  
  506.         max = 0; lnum = 1; i = 1; 
  507.         while(i <= rear) 
  508.         { 
  509.             n = 0; 
  510.             while(i <= rear && qu[i].lno == lnum) 
  511.             { 
  512.                 n++; 
  513.                 i++; 
  514.             } 
  515.             lnum = qu[i].lno; 
  516.             if(n > max) max = n; 
  517.         } 
  518.         return max; 
  519.     } 
  520.     else return 0; 
  521.  
  522.  
  523. //  
  524.  
  525. // ,       , ,  false 
  526. //1    h 
  527. //2    n 
  528. //3 n [2 h-1 -1,2 h -1]      
  529.  
  530. int CompBTNode(BTNode *b) 
  531.     if(b == NULL)  return 0; 
  532.     if(b->left == NULL && b->right == NULL) return 1; 
  533.     if(b->left == NULL && b->right != NULL || b->left != NULL && b->right == NULL) 
  534.         return 0; 
  535.     return CompBTNode(b->left) && CompBTNode(b->right); 
  536.  
  537. int CompBTNode2(BTNode *b) 
  538.     BTNode *st[MAXSIZE], *p; 
  539.     int front=0,rear=0,flag=1; 
  540.     if(b != NULL) 
  541.     { 
  542.         rear++; 
  543.         st[rear]=b; 
  544.         while(front < rear) 
  545.         { 
  546.             front = front +1; 
  547.             p=st[front]; 
  548.             if(p->left != NULL) 
  549.             { 
  550.                 rear++; 
  551.                 st[rear]=p->left; 
  552.             } 
  553.             if(p->right != NULL) 
  554.             { 
  555.                 rear++; 
  556.                 st[rear]=p->right; 
  557.             } 
  558.             if(p->left != NULL && p->right == NULL || p->left == NULL && p->right == NULL) 
  559.                 break
  560.         } 
  561.         while(front < rear) 
  562.         { 
  563.             front = front+1; 
  564.             p=st[front]; 
  565.             if(p->left != NULL || p->right !=NULL) 
  566.             { flag = 0; break;} 
  567.             else  
  568.             { 
  569.                 rear++; 
  570.                 st[rear]=p; 
  571.             } 
  572.         } 
  573.         return flag; 
  574.     } 
  575.     return 0; 
  576.   
  577.  
  578. //  
  579. // , ,   , ,  
  580. void AllPath(BTNode *b) 
  581.     struct snode 
  582.     { 
  583.         BTNode *node; 
  584.         int parent; 
  585.     }q[MAXSIZE]; 
  586.     BTNode *tmp; 
  587.     int front =-1, rear =-1, index=0; 
  588.     if(b != NULL) 
  589.     { 
  590.         rear++; 
  591.         q[rear].node = b; 
  592.         q[rear].parent = -1; 
  593.          
  594.         while(front < rear) 
  595.         { 
  596.             front ++; 
  597.             tmp = q[front].node; 
  598.             if(tmp->right == NULL && tmp->left == NULL)    // , parent  
  599.             { 
  600.                 printf("%c   :
    "
    ,tmp->data); 
  601.                 index = front; 
  602.                 while(q[index].parent >= -1) 
  603.                 { 
  604.                     index--; 
  605.                     printf("%c -->",q[index].node->data);                    
  606.                 } 
  607.             } 
  608.             if(tmp->left != NULL)            // ,    
  609.             { 
  610.                 rear++; 
  611.                 q[rear].node = tmp->left; 
  612.                 q[rear].parent = front; 
  613.             } 
  614.             if(tmp->right != NULL)              // ,    
  615.             { 
  616.                 rear++; 
  617.                 q[rear].node = tmp->right; 
  618.                 q[rear].parent = front; 
  619.             } 
  620.         } 
  621.     } 
  622.  
  623.   
  624. //    
  625.  
  626. void AllPath2(BTNode *b, char path[], int pathlen) 
  627.     int i; 
  628.     if(b != NULL) 
  629.     { 
  630.         if(b->left == NULL && b->right == NULL)           //    
  631.         { 
  632.             for(i=pathlen-1; i>=0; i--) 
  633.             { 
  634.                 printf("%c  ",b->data); 
  635.             } 
  636.         } 
  637.         else 
  638.         { 
  639.             path[pathlen] = b; 
  640.             pathlen++;                                    //    
  641.             AllPath2(b->left,path, pathlen); 
  642.             AllPath2(b->right,path,pathlen); 
  643.             pathlen--; 
  644.         } 
  645.     } 
  646. }   //  
  647.  
  648. //  
  649. void LongPath(BTNode *b, char path[], int pathlen, char longPath[], int longPathlen) 
  650.     int i; 
  651.     if(b == NULL) 
  652.     { 
  653.         if(pathlen > longPathlen )           // ,  
  654.         { 
  655.             for(i=pathlen-1; i>=0; i--) 
  656.                 longPath[i] = path[i]; 
  657.             longPathlen = pathlen;           
  658.         } 
  659.     } 
  660.     else 
  661.     { 
  662.         path[pathlen] = b->data;             //  
  663.         pathlen++; 
  664.         LongPath(b->left, path, pathlen, longPath, longPathlen);  
  665.         LongPath(b->right, path, pathlen, longPath, longPathlen); 
  666.         pathlen--; 
  667.     } 
  668. }  //  
  669.  
  670.  
  671. //  
  672. //  f(b) = 0  b=null  , f(b) = 1   b->left == NULL && b->right == NULL,   
  673. int Nodes(BTNode *b) 
  674.     int i, ii; 
  675.     if(b == NULL) return 0; 
  676.     else if(b->left == NULL && b->right == NULL) return 1; 
  677.     else  
  678.     { 
  679.         i = Nodes(b->left) 
  680.         ii = Nodes(b->right); 
  681.         return (i + ii +1); 
  682.     } 
  683.  
  684. //          null.           null   
  685.  
  686. //    
  687.  
  688. int LeafNode(BTNode *b) 
  689.     BTNode *st[MAXSIZE], *p; 
  690.     int num=0,front=0,rear=0; 
  691.     if(b != NULL) 
  692.     { 
  693.         rear = (rear + 1)%MAXSIZE; 
  694.         st[rear] = b; 
  695.         while(front < rear || rear +1 <= front) 
  696.         { 
  697.             front = (front + 1)% MAXSIZE; 
  698.             p=st[front]; 
  699.             if(p->left == NULL && p->right == NULL) 
  700.                 num++; 
  701.             else if(p->left != NULL) 
  702.             { 
  703.                 rear = (rear + 1)%MAXSIZE; 
  704.                 st[rear] = p->left; 
  705.             }else if(p->right != NULL) 
  706.             { 
  707.                 rear = (rear + 1)%MAXSIZE;               
  708.                 st[rear] = p->right; 
  709.             } 
  710.         } 
  711.     } 
  712.   
  713. //       , ,   
  714. //    while(front < rear || rear +1 <= front) 
  715.  
  716. int LeafNode(BTNode *b) 
  717.     int num1 =0, num2=0; 
  718.     if(b == NULL) return 0; 
  719.     else if(b->left == NULL && b->right == NULL)  return 1; 
  720.     else  
  721.     { 
  722.         num1 =  LeafNode(b->left); 
  723.         num2 =  LeafNode(b->right); 
  724.         return num1+num2; 
  725.     } 
  726.  
  727. //     ,  return num1 + num2;  , 
  728. //   ,  ,  
  729.  
  730. //  
  731. int DSonNode(BTNode *b) 
  732.     int num1, num2,n=0;   // n    
  733.     if(b == NULL) n = 0; 
  734.     else if(b->left == NULL || b->right == NULL) n = 0; 
  735.     else  n++; 
  736.  
  737.     num1 = DSonNode(b->left); 
  738.     num2 = DSonNode(b->right); 
  739.     return num1+num2+n; 
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746. //  
  747. //   ,  
  748. void DeleteNodes(BTNode *b) 
  749.     if(b != NULL) 
  750.     { 
  751.         DeleteNodes(b->left); 
  752.         DeleteNodes(b->right); 
  753.         free(b); 
  754.     } 
  755.  
  756.  
  757.  
  758. //  
  759. void Swap(BTNode *b) 
  760.     BTNode  *temp; 
  761.     if(b != NULL) 
  762.     { 
  763.         temp = (BTNode *) malloc(sizeof(BTNode)); 
  764.         temp=b; 
  765.         temp->left->data = b->right->data; 
  766.         temp->right->data = b->left->data; 
  767.  
  768.         Swap(b->left); 
  769.         Swap(b->right); 
  770.     } 
  771.  
  772. void Swap(BTNode *b) 
  773.     BTNode *t, *t1, *t2; 
  774.     if(b == NULL)  t= NULL; 
  775.     else  
  776.     { 
  777.         t = (BTNode *)malloc(sizeof(BTNode)); 
  778.         t->data = b->data; 
  779.         t1 = Swap(b->left); 
  780.         t2 = Swap(b->right); 
  781.         t->left = t2; 
  782.         t->right = t1; 
  783.     } 
  784.     return t;