• 二叉树排序查找

    二叉树排序查找

    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. }