数据结构 实验五 查找

数据结构 实验五  查找

 

查找这一部分的代码量较之前少一些,也较为简单,此处给出了二叉排序树上的查找、插入、删除等基本操作的算法,由于二叉排序树不考虑对整棵树的动态优化,所以比较简单易懂;平衡二叉树弥补了二叉排序树的这一不足之处,实现的方式也很巧妙。

 

下面是二叉排序数的相关代码:

 

#include <stdio.h>
#include <stdlib.h>
#include "Datahead.h"


/*二叉树的链式存储表示*/
typedef int TElemType;      /*由用户定义的实际数据类型*/

typedef struct BiTNode
{   TElemType data;
    struct BiTNode *lchild, *rchild;    /*左右孩子指针*/
} BiTNode, *BiTree;                        /*结点类型*/



typedef int KeyType;            /*二叉排序树使用整形数据*/
typedef int ElemType;            /*二叉排序树使用整形数据*/


void main()
{
    // 函数声明
    void Inorder(BiTree T);                                                /*中序遍历二叉树*/
    Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree *p);        
    Status InsertBST(BiTree *T, ElemType e);
    Status DeleteBST(BiTree *T,  KeyType key);
    Status Delete(BiTree *p);
    Status EQ(KeyType key1, KeyType key2);
    Status LT(KeyType key1, KeyType key2);

    BiTree T = NULL;
    BiTree p = NULL;

    printf("\n**********************************************\n");
    printf("                   二叉树排序树查找");
    printf("\n**********************************************\n");

/*请补充代码 */
/*所用函数,请参照课本算法*/

    int select;
    TElemType e;

    while (TRUE)
    {
        printf("\n\n(1)、插入新值\n");
        printf("(2)、查找\n");
        printf("(3)、删除\n");
        printf("(4)、中序遍历二叉排序树\n");
        printf("(0)、退出程序\n");
        printf("\n      请选择操作序号:");

        scanf("%d", &select);
        switch (select)
        {
        case 1:
            printf("请输入希望插入的元素的值: ");
            scanf("%d", &e);
            if(InsertBST(&T, e))
            {
                printf("\n插入成功!\n");
            }
            else
            {
                printf("\n插入失败!\n");
            }
            break;

        case 2:
            printf("请输入希望查找的元素的值: ");
            scanf("%d", &e);
            if(SearchBST(T, e, NULL, &p))
            {
                printf("\n您查找的元素存在\n");
            }
            else
            {
                printf("\n您查找的元素不存在!\n");
            }
            break;
        case 3:
            printf("请输入希望删除的元素的值: ");
            scanf("%d", &e);
            if(DeleteBST(&T, e))
            {
                printf("\n删除成功!\n");
            }
            else
            {
                printf("\n删除失败,不存在该元素!\n");
            }
            break;
        case 4:
            printf("\n当前二叉排序树中序遍历为:\n");
            Inorder(T);
            break;
        case 0:
            return;
        default:
            break;
        }
    }

    system("pause");
}


/*中序遍历二叉树的简单写法 */
void Inorder(BiTree T)
{
    if(T)
    {
        Inorder(T->lchild);
        printf("%d  ",T->data);
        Inorder(T->rchild);
    }
}


// 判断是否相等
Status EQ(KeyType key1, KeyType key2){
    if (key1==key2) return TRUE;
    else return FALSE;
}

Status LT(KeyType key1, KeyType key2){
    if (key1<key2) return TRUE;
    else return FALSE;
}


Status SearchBST(BiTree T, KeyType key, BiTree f, BiTree *p) {
  /*  算法9.5(b) */
  /*  在根指针T所指二叉排序树中递归地查找其关键字等于key的数据元素, */
  /*  若查找成功,则指针p指向该数据元素结点,并返回TRUE, */
  /*  否则指针p指向查找路径上访问的最后一个结点并返回FALSE, */
  /*  指针f指向T的双亲,其初始调用值为NULL */
  if (!T) { *p = f;  return FALSE; }                        /*  查找不成功 */
  else if (EQ(key, T->data)) { *p = T;  return TRUE; }        /*  查找成功 */
  else if (LT(key, T->data))
    return SearchBST(T->lchild, key, T, p);  /*  在左子树中继续查找 */
  else  
    return SearchBST(T->rchild, key, T, p);  /*  在右子树中继续查找 */
} /*  SearchBST  */


Status InsertBST(BiTree *T, ElemType e) 
{ /*  算法9.6 */
  /*  当二叉排序树T中不存在关键字等于e.key的数据元素时, */
  /*  插入e并返回TRUE,否则返回FALSE */
  BiTree p, s;
  if (!SearchBST(*T, e, NULL, &p)) 
  {   /*  查找不成功 */
    s = (BiTree)malloc(sizeof(BiTNode));
    s->data = e;  s->lchild = s->rchild = NULL;  
    if (!p) *T = s;                            /*  插入 s 为新的根结点 */
    else if (LT(e, p->data)) p->lchild=s;    /*  插入s为左孩子 */
    else p->rchild = s;                        /*  插入 s 为右孩子 */
    return TRUE;
  } 
  else return FALSE;                        /*  树中已有关键字相同的结点,不再插入 */
} /*  Insert BST */


Status DeleteBST(BiTree *T,  KeyType key) 
{ 
    Status Delete(BiTree *p);
  /*  算法9.7  */
  /*  若二叉排序树T中存在关键字等于key的数据元素时, */
  /*  则删除该数据元素结点p,并返回TRUE;否则返回FALSE */
  if (!(*T)) return FALSE;       /*  不存在关键字等于key的数据元素 */
  else {
    if (EQ(key, (*T)->data))  /*  找到关键字等于key的数据元素 */
      return Delete(T);
    else if (LT(key, (*T)->data)) return DeleteBST(&((*T)->lchild),key);
    else return DeleteBST(&((*T)->rchild), key);
  }
} /*  DeleteBST */


Status Delete(BiTree *p) {  /*  算法9.8 */
  /*  从二叉排序树中删除结点p,并重接它的左或右子树 */
  BiTree q, s;
  if (!((*p)->rchild)) 
  {  /*  右子树空则只需重接它的左子树 */
    q = *p;  *p = (*p)->lchild;  free(q);
  }
  else if (!((*p)->lchild)) 
  {  /*  只需重接它的右子树 */
    q = *p;  *p = (*p)->rchild;  free(q);
  }
  else
  {  /*  左右子树均不空 */
    q = *p;  s = (*p)->lchild;
    while (s->rchild)   /*  转左,然后向右到尽头 */
    {
        q = s;  s = s->rchild; 
    }
    (*p)->data = s->data;                  /*  s指向被删结点的"后继" */
    if (q != *p)
        q->rchild = s->lchild;  /*  重接*q的右子树 */
    else
        q->lchild = s->lchild;         /*  重接*q的左子树 */
    free(s);    
  }
  return TRUE;
} /*  Delete */

 

 

可以直接复制上述代码,也可以去我的网盘下载源代码cpp文件

http://pan.baidu.com/s/1zjiDD

 

 

 

 

posted @ 2013-11-26 11:13  云端之上  阅读(761)  评论(0编辑  收藏  举报