二叉树排序查找

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. typedef int KeyType;
  4. typedef char ElemType[10];
  5. typedef struct tnode
  6. {
  7. KeyType key;
  8. ElemType data;
  9. struct tnode *lchild,*rchild;
  10. } BSTNode;
  11. BSTNode *BSTSearch(BSTNode *bt,KeyType k)
  12. {
  13. BSTNode *p=bt;
  14. while (p!=NULL && p->key!=k)
  15. {
  16. if (k<p->key)
  17. p=p->lchild; /*沿左子树查找*/
  18. else
  19. p=p->rchild; /*沿右子树查找*/
  20. }
  21. return(p);
  22. }
  23. int BSTInsert(BSTNode *&bt,KeyType k)
  24. {
  25. BSTNode *f,*p=bt;
  26. while (p!=NULL)
  27. {
  28. if (p->key==k)
  29. return(0);
  30. f=p; /*f指向*p结点的双亲结点*/
  31. if (p->key>k)
  32. p=p->lchild; /*在左子树中查找*/
  33. else
  34. p=p->rchild; /*在右子树中查找*/
  35. }
  36. p=(BSTNode *)malloc(sizeof(BSTNode)); /*建立新结点*/
  37. p->key=k;
  38. p->lchild=p->rchild=NULL;
  39. if (bt==NULL) /*原树为空时,*p作为根结点插入*/
  40. bt=p;
  41. else if (k<f->key)
  42. f->lchild=p; /*插入*p作为*f的左孩子*/
  43. else
  44. f->rchild=p; /*插入*p作为*f的右孩子*/
  45. return(1);
  46. }
  47. void CreateBST(BSTNode *&bt,KeyType str[],int n)
  48. {
  49. bt=NULL; /*初始时bt为空树*/
  50. int i=0;
  51. while (i<n)
  52. {
  53. BSTInsert(bt,str[i]); /*将关键字str[i]插入二叉排序树bt中*/
  54. i++;
  55. }
  56. }
  57. void DispBST(BSTNode *bt)
  58. {
  59. if (bt!=NULL)
  60. { printf("%d",bt->key);
  61. if (bt->lchild!=NULL || bt->rchild!=NULL)
  62. { printf("(");
  63. DispBST(bt->lchild); /*递归处理左子树*/
  64. if (bt->rchild!=NULL) printf(",");
  65. DispBST(bt->rchild); /*递归处理右子树*/
  66. printf(")");
  67. }
  68. }
  69. }
  70. int BSTDelete(BSTNode *&bt,KeyType k)
  71. {
  72. BSTNode *p=bt,*f,*r,*f1;
  73. f=NULL; /*p指向待比较的结点,f指向*p的双亲结点*/
  74. while (p!=NULL && p->key!=k)/*查找值域为x的结点*/
  75. { f=p;
  76. if (p->key>k)
  77. p=p->lchild; /*在左子树中查找*/
  78. else
  79. p=p->rchild; /*在右子树中查找*/
  80. }
  81. if (p==NULL) /*未找到key域为k的结点*/
  82. return(0);
  83. else if (p->lchild==NULL) /**p为被删结点,若它无左子树*/
  84. {
  85. if (f==NULL) /**p是根结点,则用右孩子替换它*/
  86. bt=p->rchild;
  87. else if (f->lchild==p) /**p是双亲结点的左孩子,则用其右孩子替换它*/
  88. { f->lchild=p->rchild;
  89. free(p);
  90. }
  91. else if(f->rchild==p) /**p是双亲结点的右孩子,则用其右孩子替换它*/
  92. { f->rchild=p->rchild;
  93. free(p);
  94. }
  95. }
  96. else if (p->rchild==NULL) /**p为被删结点,若它无右子树*/
  97. {
  98. if (f==NULL) /**p是根结点,则用左孩子替换它*/
  99. bt=p->lchild;
  100. if (f->lchild==p) /**p是双亲结点的左孩子,则用其左孩子替换它*/
  101. { f->lchild=p->lchild;
  102. free(p);
  103. }
  104. else if(f->rchild==p) /**p是双亲结点的右孩子,则用其左孩子替换它*/
  105. { f->rchild=p->lchild;
  106. free(p);
  107. }
  108. }
  109. else /**p为被删结点,若它有左子树和右子树*/
  110. {
  111. f1=p;r=p->lchild; /*查找*p的左子树中的最右下结点*r*/
  112. while (r->rchild!=NULL) /**r一定是无右子树的结点,*f1作为r的双亲*/
  113. { f1=r;
  114. r=r->rchild;
  115. }
  116. if (f1->lchild==r) /**r是*f1的左孩子,删除*r*/
  117. f1->lchild=r->rchild;
  118. else if (f1->rchild==r) /**r是*f1的右孩子,删除*r*/
  119. f1->rchild=r->lchild;
  120. r->lchild=p->lchild; /*以下语句是用*r替代*p*/
  121. r->rchild=p->rchild;
  122. if (f==NULL) /**f为根结点*/
  123. bt=r; /*被删结点是根结点*/
  124. else if (f->lchild==p) /**p是*f的左孩子*/
  125. f->lchild=r;
  126. else /**p是*f的右孩子*/
  127. f->rchild=r;
  128. free(p);
  129. }
  130. return(1);
  131. }
  132. void main()
  133. {
  134. BSTNode *bt=NULL,*p;
  135. KeyType a[]={10,6,12,8,3,20,9,25,15},k;
  136. int n=9;
  137. CreateBST(bt,a,n);
  138. printf("BST:");DispBST(bt);printf("\n");
  139. k=9;
  140. printf("查找关键字为%d的结点\n",k);
  141. p=BSTSearch(bt,k);
  142. if (p!=NULL)
  143. printf("存在关键字为%d结点\n",k);
  144. else
  145. printf("不存在关键字为%d结点\n",k);
  146. k=7;
  147. printf("插入关键字为%d的结点\n",k);
  148. BSTInsert(bt,k);
  149. printf("BST:");DispBST(bt);printf("\n");
  150. k=10;
  151. printf("删除关键字为%d的结点\n",k);
  152. BSTDelete(bt,k);
  153. printf("BST:");DispBST(bt);printf("\n");
  154. }