zoukankan      html  css  js  c++  java
  • 数据结构 实验五 查找

    数据结构 实验五  查找

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

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

    #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("
    **********************************************
    ");
        printf("                   二叉树排序树查找");
        printf("
    **********************************************
    ");
    
    /*请补充代码 */
    /*所用函数,请参照课本算法*/
    
        int select;
        TElemType e;
    
        while (TRUE)
        {
            printf("
    
    (1)、插入新值
    ");
            printf("(2)、查找
    ");
            printf("(3)、删除
    ");
            printf("(4)、中序遍历二叉排序树
    ");
            printf("(0)、退出程序
    ");
            printf("
          请选择操作序号:");
    
            scanf("%d", &select);
            switch (select)
            {
            case 1:
                printf("请输入希望插入的元素的值: ");
                scanf("%d", &e);
                if(InsertBST(&T, e))
                {
                    printf("
    插入成功!
    ");
                }
                else
                {
                    printf("
    插入失败!
    ");
                }
                break;
    
            case 2:
                printf("请输入希望查找的元素的值: ");
                scanf("%d", &e);
                if(SearchBST(T, e, NULL, &p))
                {
                    printf("
    您查找的元素存在
    ");
                }
                else
                {
                    printf("
    您查找的元素不存在!
    ");
                }
                break;
            case 3:
                printf("请输入希望删除的元素的值: ");
                scanf("%d", &e);
                if(DeleteBST(&T, e))
                {
                    printf("
    删除成功!
    ");
                }
                else
                {
                    printf("
    删除失败,不存在该元素!
    ");
                }
                break;
            case 4:
                printf("
    当前二叉排序树中序遍历为:
    ");
                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

  • 相关阅读:
    C#简单读取MongoDB数据
    百度地图自定义图标
    递归实现DropDownList层级
    [MYSQL]-EXPLAIN用法
    java对 zip文件的压缩和解压(ant解决中文乱码)
    将Excel表结构导入到Powerdesigner
    weblogic解决jar包冲突
    深入理解javascript原型和闭包(3)——prototype原型
    深入理解javascript原型和闭包(2)——函数和对象的关系
    深入理解JavaScript的原型和闭包(一)
  • 原文地址:https://www.cnblogs.com/uppercloud/p/DataStructure_Search.html
Copyright © 2011-2022 走看看