9_8.C
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 9_8.c                       */
  3. /*    二叉搜索树搜索法                      */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct tree                       /* 树的结构宣告        */
  7. {
  8.    int data;                      /* 节点数据            */
  9.    struct tree *left;             /* 指向左子树的指标    */
  10.    struct tree *right;            /* 指向右子树的指标    */
  11. };
  12. typedef struct tree treenode;     /* 树的结构新型态      */
  13. typedef treenode *btree;          /* 宣告树节点指标型态  */
  14. /* ---------------------------------------- */
  15. /*  插入二叉树的节点                        */
  16. /* ---------------------------------------- */
  17. btree insertnode(btree root,int value)
  18. {
  19.    btree newnode;                 /* 树根指标            */
  20.    btree current;                 /* 目前树节点指标      */
  21.    btree back;                    /* 父节点指标          */
  22.    /* 建立新节点记忆体 */
  23.    newnode = ( btree ) malloc(sizeof(treenode));
  24.    newnode->data = value;         /* 建立节点内容        */
  25.    newnode->left = NULL;          /* 设定指标初值        */
  26.    newnode->right = NULL;         /* 设定指标初值        */
  27.    if ( root == NULL )            /* 是否是根节点        */
  28.    {
  29.       return newnode;             /* 传回新节点位置      */
  30.    }
  31.    else
  32.    {
  33.       current = root;             /* 保留目前树指标      */
  34.       while ( current != NULL )
  35.       {
  36.          back = current;          /* 保留父节点指标      */
  37.          if ( current->data > value ) /* 比较节点值      */
  38.             current = current->left;  /* 左子树          */
  39.          else
  40.             current = current->right; /* 右子树          */
  41.       }
  42.       if ( back->data > value )   /* 接起父子的链结      */
  43.          back->left = newnode;    /* 左子树              */
  44.       else
  45.          back->right = newnode;   /* 右子树              */
  46.    }
  47.    return root;                   /* 传回树根指标        */
  48. }
  49. /* ---------------------------------------- */
  50. /*  建立二叉树                              */
  51. /* ---------------------------------------- */
  52. btree createbtree(int *data,int len)
  53. {
  54.    btree root = NULL;             /* 树根指标            */
  55.    int i;
  56.    for ( i = 0; i < len; i++ )    /* 用回路建立树状结构  */
  57.       root = insertnode(root,data[i]);
  58.    return root;
  59. }
  60. /* ---------------------------------------- */
  61. /*  使用二叉搜索树执行搜索                  */
  62. /* ---------------------------------------- */
  63. btree btreesearch(btree ptr,int value)
  64. {
  65.    while ( ptr != NULL )          /* 主回路              */
  66.    {
  67.       if ( ptr->data == value )   /* 找到了              */
  68.          return ptr;              /* 传回节点指标        */
  69.       else
  70.          if ( ptr->data > value ) /* 比较数据            */
  71.             ptr = ptr->left;      /* 左子树              */
  72.          else
  73.             ptr = ptr->right;     /* 右子树              */
  74.    }
  75.    return NULL;                   /* 没有找到            */
  76. }
  77. /* ---------------------------------------- */
  78. /*  主程式: 使用二叉搜索树执行搜索          */
  79. /* ---------------------------------------- */
  80. void main()
  81. {
  82.    btree root = NULL;             /* 树根指标            */
  83.    btree ptr = NULL;              /* 树指标              */
  84.    int value;                     /* 节点值              */
  85.    /* 二叉树节点数据 */
  86.    int data[9] = { 55, 61, 41, 87, 24, 35, 79, 11, 99 };
  87.    root = createbtree(data,9);    /* 建立树状结构        */
  88.    while ( 1 )                    /* 主回路开始          */
  89.    {
  90.       printf("请输入寻找数据(0 - 99) ==> ");
  91.       scanf("%d",&value);         /* 读取数据            */
  92.       if ( value != -1 )          
  93.       {
  94.          ptr = btreesearch(root,value); /* 使用二叉搜索树执行搜索 */
  95.          if ( ptr != NULL )
  96.             printf("二叉搜索树搜索: 节点数据是 [%d]n",ptr->data);
  97.          else
  98.             printf("二叉搜索树搜索: 没有找到n");
  99.       }
  100.       else
  101.          exit(1);                 /* 结束程式            */
  102.    }
  103. }