1. #include <stdio.h> 
  2. #include "stdlib.h" 
  3. #define MAXL 50 
  4.  
  5. typedef int KeyType  ; 
  6. typedef char * InfoType ; 
  7. typedef struct  
  8.     KeyType key; 
  9.     InfoType data; 
  10. }NodeType; 
  11. typedef NodeType SeqList[MAXL]; 
  12.  
  13. typedef struct 
  14.     KeyType key; 
  15.     int link; 
  16. }IdxType; 
  17. typedef IdxType IDX[MAXL]; 
  18.  
  19.  
  20. typedef struct node 
  21.     KeyType key; 
  22.     InfoType data; 
  23.     struct node *lchild, *rchild; 
  24. }BSTNode; 
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33. //二分查找法 
  34. int BinSearch(SeqList R, int n, KeyType k) 
  35.     int low = 0, high = n-1, mid=0;  
  36.     while(low <= high) 
  37.     { 
  38.         mid = (low + high) / 2; 
  39.         if(R[mid].key == k)  return mid; 
  40.         else if(R[mid].key > k ) high = mid-1; 
  41.         else low = mid + 1; 
  42.     } 
  43.     return -1; 
  44.  
  45. //一下是递归算法 
  46. int BinSearch2(SeqList R, int low, int high, KeyType k) 
  47.     int mid; 
  48.     if(low <= high) 
  49.     { 
  50.         mid = (high + low )/ 2; 
  51.         if(R[mid].key < k) 
  52.             return BinSearch2(R,mid + 1,high, k); 
  53.         else if(R[mid].key > k ) 
  54.             return BinSearch2(R,low, high -1,k); 
  55.         else  return mid; 
  56.     } 
  57.     else return -1; 
  58.  
  59. //分块查找 
  60. int IdxSearch(IDX I, int m,SeqList R, int n,KeyType k) 
  61.     int low=0, high = m-1, mid,i; 
  62.     int b = n/m; 
  63.     while(low <= high)   
  64.     { 
  65.         mid = (low + high) / 2; 
  66.         if(I[mid].key >= k)  high = mid -1; 
  67.         else low = mid +1; 
  68.     } 
  69.  
  70.     if(low < m) 
  71.     { 
  72.         i = I[low].link; 
  73.         while(i<=I[low].link + b -1 && R[i].key != k) i++; 
  74.         if(i <= I[low].link+b-1)  return i; 
  75.         else return -1; 
  76.     } 
  77.     return -1; 
  78.  
  79.  
  80.  
  81.  
  82. //树的查找节点的算法 
  83.  
  84. BSTNode *BSTSearch(BSTNode *bt, KeyType k) //查找树中的节点当为空的时候 返回空,当等于的时候返回 其本身,否则的递归调用左或者右子树 
  85.     if(bt == NULL)  return NULL;             
  86.     else if(bt->key  == k)  return bt; 
  87.     else if (bt->key > k) return BSTSearch (bt->lchild, k); 
  88.     else return BSTSearch (bt->rchild,k); 
  89.  
  90. //递归插入节点 
  91. int BSTInsert(BSTNode *p, KeyType k) 
  92.     if(p == NULL) 
  93.     { 
  94.         p = (BSTNode *)malloc(sizeof(BSTNode)); 
  95.         p->key = k; 
  96.         p->lchild = p->rchild = NULL; 
  97.         return 1; 
  98.     } 
  99.     else if(k == p->key )  return 0; 
  100.     else if(k > p->key)  return BSTInsert(p->rchild,k); 
  101.     else return BSTInsert (p->lchild,k); 
  102.  
  103. //构造排序树 
  104. void CreateBST(BSTNode *bt, KeyType str[],int n) 
  105.         int i=0; 
  106.     bt = NULL; 
  107.     while(i<n) 
  108.     { 
  109.         BSTInsert(bt,str[i]); 
  110.         i++; 
  111.     } 
  112.  
  113. //删除节点 
  114.  
  115. int BSTDelete(BSTNode *bt, KeyType k) 
  116.     BSTNode *p = bt, *f,*r,*f1; 
  117.     f = NULL; 
  118.     while(p != NULL && p->key != k) //此循环是为了能够找到,所在的节点 
  119.     { 
  120.         f = p;                              //f表示父节点 
  121.         if(p->key > k) p = p->lchild; 
  122.         else p = p->rchild; 
  123.     } 
  124.  
  125.     if(p == NULL)  return 0;           //为找到所需节点 
  126.     else if(p->lchild == NULL)         //左子树为空的情况 
  127.     { 
  128.         if(f == NULL)  bt = p->rchild; //如果父节点是根节点,则用右子树代替他 
  129.         else if(f->lchild == p) 
  130.         { 
  131.             f->lchild = p->rchild; 
  132.             free(p); 
  133.         }else if(f->rchild == p) 
  134.         { 
  135.             f->rchild = p->rchild; 
  136.             free(p); 
  137.         } 
  138.     } 
  139.     else if(p->rchild == NULL) 
  140.     { 
  141.         if(f == NULL)  bt = p->lchild; 
  142.         else if(f->lchild == p) 
  143.         { 
  144.             f->lchild = p->lchild; 
  145.             free(p); 
  146.         } 
  147.         else if(p->rchild == p) 
  148.         { 
  149.             f->lchild = p->lchild; 
  150.             free(p); 
  151.         } 
  152.     } 
  153.     else 
  154.     { 
  155.         f1=p; r = p->lchild; 
  156.         while(r->rchild != NULL) 
  157.         { 
  158.             f1 = r; 
  159.             r = r->rchild; 
  160.         } 
  161.  
  162.         if(f1->lchild == r)  f1->lchild = r->lchild; 
  163.         else if(f1->rchild == r) f1->rchild = r->lchild; 
  164.  
  165.         r->lchild = p->lchild;        //用r代替p 
  166.         r->rchild = p->rchild; 
  167.  
  168.         if(f == NULL)  bt =r; 
  169.         else if (f->lchild ==p) 
  170.             f->lchild = r; 
  171.         else f->rchild = r; 
  172.         free(p);         
  173.     } 
  174.     return 1; 
  175.  
  176. //设计在二叉排序树中插入指定关键字的非递归算法 
  177. int BSTInsert1(BSTNode *bt, KeyType k) 
  178.     BSTNode *f, *p = bt; 
  179.     while(p != NULL) 
  180.     { 
  181.         if(p->key == k)  return 0; 
  182.         f = p; 
  183.         if(p->key > k)  p = p->lchild; 
  184.         else p = p->rchild; 
  185.     }                                   //在树中找到需要插入节点的位置 
  186.  
  187.     p = (BSTNode *)malloc(sizeof(BSTNode )); 
  188.     p->key = k; 
  189.     p->lchild = p->rchild = NULL; 
  190.     if(bt == NULL)                      //判断是否 头结点是否为空 f保存的是p的父节点 
  191.         bt = p; 
  192.     else if(f->key > k) 
  193.         f->lchild = p; 
  194.     else f->rchild = p; 
  195.     return 1; 
  196.  
  197. //递归插入节点与非递归插入的不同之处在于 递归在刚开始的时候就进行判断是否为要插入的位置,然后根据条件确定是否递归 
  198. //非递归则是先利用循环找到要插入的位置,然后再进行判断是插入到左节点 还是右节点 
  199.  
  200.  
  201.  
  202. //递增的输出一个二叉树的节点, 由题知应该使用中序遍历 
  203. void order(BSTNode *bt) 
  204.     if(bt != NULL) 
  205.     { 
  206.         order(bt->lchild); 
  207.         printf("%d ",bt->key); 
  208.         order(bt->rchild); 
  209.     } 
  210.  
  211. //设计一个算法从大到小输出其值不小k的关键字    因为是从大到小 所以先遍历右子树 
  212. void Output(BSTNode *bt, KeyType k) 
  213.     if(bt == NULL) return ; 
  214.     if(bt->rchild != NULL) Output(bt->rchild,k); 
  215.     if(bt->key >= k)printf("%d ", bt->key ); 
  216.     if(bt->lchild != NULL) Output(bt->lchild,k); 
  217.  
  218. //设计一个算法求出指定节点在二叉树中的层次 
  219. int level(BSTNode *bt, KeyType k) 
  220.     int n=1; 
  221.     BSTNode *p = bt; 
  222.     while(p != NULL && p->key != k) 
  223.     { 
  224.         if(p->key > k) p = p->lchild; 
  225.         else p = p->rchild; 
  226.         n++;                             //n在此处是记录层数,因为查找是一层一层向下找的 
  227.     } 
  228.  
  229.     if(p != NULL) return n; 
  230.     else return 0; 
  231.  
  232.  
  233. #define MAXWORD 20 
  234.  
  235. typedef struct  tnode1 
  236.     char ch; 
  237.     int count; 
  238.     struct tnode1 *lchild, *rchild; 
  239. }TNode; 
  240.  
  241. TNode * CreateTree(TNode *&p, char c) 
  242.     if(p == NULL) 
  243.     { 
  244.         p = (TNode *)malloc(sizeof(TNode )); 
  245.         p->ch = c;  p->count = 1; 
  246.         p->lchild = p->rchild = NULL; 
  247.         return p; 
  248.     } 
  249.     else if(p->ch == c) p->count++; 
  250.     else if(p->ch > c) CreateTree(p->lchild,c); 
  251.     else CreateTree(p->rchild,c); 
  252.  
  253. void DispTree(TNode *p) 
  254. {    
  255.     if(p != NULL) 
  256.     { 
  257.         DispTree(p->lchild); 
  258.         printf("%c  %d\n",p->ch,p->count); 
  259.         DispTree(p->rchild); 
  260.     } 
  261.  
  262. void main() 
  263.     TNode *root = NULL; 
  264.     int i=0; 
  265.     char str[MAXWORD]; 
  266.     printf("Input a string :\n"); 
  267.     gets(str); 
  268.     while(str[i] != '\0'
  269.     { 
  270.         CreateTree(root,str[i]); 
  271.         i++; 
  272.     } 
  273.     printf("The string and times they appears :\n");     
  274.     DispTree(root);