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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 7_6.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 createbtree(int *data,int pos)
  18. {
  19.    btree newnode;                 /* 新节点指标         */
  20.    if ( data[pos] == 0 || pos > 15 )  /* 终止条件       */
  21.       return NULL;
  22.    else
  23.    {
  24.       /* 建立新节点记忆体 */
  25.       newnode = ( btree ) malloc(sizeof(treenode));
  26.       newnode->data = data[pos];  /* 建立节点内容       */
  27.       /* 建立左子树的递归呼叫 */
  28.       newnode->left = createbtree(data,2*pos);
  29.       /* 建立右子树的递归呼叫 */
  30.       newnode->right = createbtree(data,2*pos+1);
  31.       return newnode;
  32.    }
  33. }
  34. /* ---------------------------------------- */
  35. /*  二叉搜索树的搜索                        */
  36. /* ---------------------------------------- */
  37. btree btreefind(btree ptr,int value)
  38. {
  39.    while ( ptr != NULL )          /* 主回路             */
  40.    {
  41.       if ( ptr->data == value )   /* 找到了             */
  42.          return ptr;              /* 传回节点指标       */
  43.       else
  44.          if ( ptr->data > value ) /* 比较数据           */
  45.             ptr = ptr->left;      /* 左子树             */
  46.          else
  47.             ptr = ptr->right;     /* 右子树             */
  48.    }
  49.    return NULL;                   /* 没有找到           */
  50. }
  51. /* ---------------------------------------- */
  52. /*  二叉树遍历搜索                          */
  53. /* ---------------------------------------- */
  54. btree btreesearch(btree ptr,int value)
  55. {
  56.    btree ptr1,ptr2;
  57.    if ( ptr != NULL )             /* 终止条件           */
  58.    {
  59.       if ( ptr->data == value )   /* 找到了             */
  60.          return ptr;              /* 传回节点指标       */
  61.       else
  62.       /* 往左子树找 */
  63.       ptr1 = btreesearch(ptr->left,value);
  64.       /* 往右子树找 */
  65.       ptr2 = btreesearch(ptr->right,value);
  66.       if ( ptr1 != NULL )
  67.          return ptr1;             /* 在左子树           */
  68.       else
  69.          if ( ptr2 != NULL )
  70.             return ptr2;          /* 在右子树           */
  71.          else
  72.             return NULL;          /* 没有找到           */
  73.    }
  74.    else
  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[16] = { 0, 5, 4, 6, 2, 0, 0, 8, 1,
  87.                     3, 0, 0, 0, 0, 7, 9 };
  88.    root = createbtree(data,1);    /* 建立树状结构       */
  89.    printf("请输入寻找节点数据(1 - 9) ==> ");
  90.    scanf("%d",&value);            /* 读取节点数据       */
  91.    ptr = btreefind(root,value);   /* 二叉树搜索         */
  92.    if ( ptr != NULL )
  93.       printf("二叉搜索树: 节点数据是 [%d]n",ptr->data);
  94.    else
  95.       printf("二叉搜索树: 没有找到n");
  96.    ptr = btreesearch(root,value); /* 遍历搜索         */
  97.    if ( ptr != NULL )
  98.       printf("遍历搜索: 节点数据是 [%d]n",ptr->data);
  99.    else
  100.       printf("遍历搜索: 没有找到n");
  101. }