Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153201
  • 博文数量: 36
  • 博客积分: 802
  • 博客等级: 准尉
  • 技术积分: 717
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-02 22:47
文章分类
文章存档

2012年(36)

分类: C/C++

2012-09-04 12:11:17

其实这个相当与折半查找,左子树一定比根节点的元素值小,右子树一定比根节点的元素大。
这个寻找最小跟最大元素的算法就会很简单,
1:FindMin与FindMax
寻找最小时候就一直往左子树上走,寻找最大的时候就一直往右子树上走.

点击(此处)折叠或打开

  1. SearchNode FindMin(SearchTree T)
  2. {
  3. if(T==NULL)
  4. return NULL;
  5. else
  6. {
  7. while(T->left)
  8. T=T->left;
  9. return T;
  10. }
  11. SearchTree FindMAX(SearchTree T)
  12. {
  13. if(T==NULL)
  14. return NULL;
  15. else
  16. {
  17. if(T->left==NULL)
  18. return T;
  19. else
  20. return FindMAX(T->right);
  21. }
  22. }
2:Insert
建立的时候呢,就是一个节点一个节点的插入,比较插入比较插入的过程,然后就是递归插入。
3:Delete
删除的时候则比较麻烦。删除有好几种情况
第一种:如果节点是一片树叶,那么它立即直接被删除。这里就不做分析
第二种:如果节点有一个二字,则该节点可以在其父节点调整指针绕过该节点后被删除。即如下图所示:

即:

点击(此处)折叠或打开

  1. SearchNode *temp;
  2. if(T->left==NULL)
  3.     T=T->right;
  4. else if(T->right==NULL)
  5.    T=T->left;
  6. free(temp);//如上图,则能删除节点4
3:复杂的情况是处理有两个儿子的节点,一般的删除策略是永右子树的最小数据代替该节点的数据并递归的删除那个节点。
                        
算法如下:

temp=FindMin(T->right);
T->data=temp->data;
T->right=Delete(T->right,T->data)

整个代码的实现如下:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. #define OK 1
  4. #define ERROR 0
  5. typedef struct Node
  6. {
  7.     int data;
  8.     struct Node *left;
  9.     struct Node *right;
  10. }SearchNode,*SearchTree;

  11. //创建只含有一个元素的树
  12. SearchTree search_tree_create(int data)
  13. {
  14.     SearchTree T;
  15.     T=(SearchTree)malloc(sizeof(SearchNode));
  16.     T->data=data;
  17.     T->left=NULL;
  18.     T->right=NULL;
  19.     return T;
  20. }
  21. //插入元素,创建树
  22. SearchTree search_tree_insert(SearchTree T,int t)
  23. {
  24.     if(T==NULL)
  25.     {
  26.         T=(SearchTree)malloc(sizeof(SearchNode));
  27.         if(T==NULL)
  28.             printf("错误!\n");
  29.         else
  30.         {
  31.             T->data=t;
  32.             T->left=T->right=NULL;
  33.         }
  34.     }
  35.     else if(t<T->data)
  36.             T->left=search_tree_insert(T->left,t);
  37.     else if(t>T->data)
  38.             T->right=search_tree_insert(T->right,t);
  39.     return T;
  40. }
  41. //寻找树中最小元素
  42. SearchTree FindMin(SearchTree T)
  43. {
  44.     if(T==NULL)
  45.     {
  46.         printf("没有元素,无法寻找!\n");
  47.         return NULL;
  48.     }
  49.     else
  50.     {
  51.         while(T->left)
  52.             T=T->left;
  53.         printf("the min is %d\n",T->data);
  54.         return T;
  55.     }
  56. }
  57. //寻找树中最右边的元素,即最大值
  58. SearchTree FindMax(SearchTree T)
  59. {
  60.     if(T==NULL)
  61.     {
  62.         printf("没有元素,无法找到!\n");
  63.         return NULL;
  64.     }
  65.     else
  66.     {
  67.         while(T->right)
  68.             T=T->right;
  69.         printf("the max is %d\n",T->data);
  70.         return T;
  71.     }

  72. }
  73. //删除数组a中第三个元素a[2]
  74. SearchTree Delete(SearchTree T,int x)
  75. {
  76.     SearchNode *p;
  77.     if(T==NULL)
  78.         printf("ERROR");
  79.     else if(x<T->data)
  80.             T->left=Delete(T->left,x);
  81.     else if(x>T->data)
  82.         T->right=Delete(T->right,x);
  83.     else if(T->left&&T->right)
  84.     {
  85.         p=FindMin(T->right);
  86.         T->data=p->data;
  87.         T->right=Delete(T->right,T->data);
  88.     }
  89.     else
  90.     {
  91.         p=T;
  92.         if(T->left==NULL)
  93.             T=T->right;
  94.         else if(T->right==NULL)
  95.             T=T->left;
  96.         free(p);
  97.     }
  98.     return T;
  99. }
  100. void Output(SearchTree T,int layer)
  101. {
  102.     int i;
  103.     if(T==NULL)
  104.         return;
  105.     Output(T->right,layer+1);
  106.     for(i=0;i<layer;i++)
  107.         printf(" ");
  108.     printf("%d\n",T->data);
  109.     Output(T->left,layer+1);
  110. }
  111. int main()
  112. {
  113.     SearchTree T;
  114.     int layer=0;
  115.     int a[7];
  116.     int i;
  117.     printf("please input the number you want:");
  118.     for(i=0;i<7;i++)
  119.         scanf("%d",&a[i]);
  120.     T=search_tree_create(a[0]);
  121.     printf("After Insert:\n");
  122.     for(i=1;i<7;i++)
  123.         search_tree_insert(T,a[i]);
  124.     Output(T,layer);
  125.     FindMin(T);
  126.     FindMax(T);
  127.     T=Delete(T,a[2]);
  128.     Output(T,layer);
  129. }
阅读(1180) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~