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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 7_3_2.c                     */
  3. /*    二叉树的结构数组表示法                */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct tree                         /* 树的结构宣告       */
  7. {
  8.    int data;                        /* 节点数据           */
  9.    int left;                        /* 指向左子树的位置   */
  10.    int right;                       /* 指向右子树的位置   */
  11. };
  12. typedef struct tree treenode;       /* 树的结构新型态     */
  13. treenode btree[15];                 /* 宣告树的结构数组   */
  14. /* ---------------------------------------- */
  15. /*  建立二叉树                              */
  16. /* ---------------------------------------- */
  17. void createbtree(int *data,int len)
  18. {
  19.    int level;                       /* 树的阶层           */
  20.    int pos;                         /* -1是左树,1是右树   */
  21.    int i;
  22.    btree[0].data = data[0];         /* 建立树根节点       */
  23.    for ( i = 1; i < len; i++ )      /* 用回路建立其它节点 */
  24.    {
  25.       btree[i].data = data[i];      /* 建立节点内容       */
  26.       level = 0;                    /* 从树根开始         */
  27.       pos = 0;                      /* 设定pos值          */
  28.       while ( pos == 0 )            /* 用回路找节点位置   */
  29.       {
  30.          /* 比较是左或右子树 */
  31.          if ( data[i] > btree[level].data )
  32.             /* 右树是否有下一阶层 */
  33.             if ( btree[level].right != -1 )
  34.                level = btree[level].right;
  35.             else
  36.                pos = -1;            /* 是右树             */
  37.          else
  38.             /* 左树是否有下一阶层 */
  39.             if ( btree[level].left != -1 )
  40.                level = btree[level].left;
  41.             else
  42.                pos = 1;             /* 是左树             */
  43.       }
  44.       if ( pos == 1 )               /* 建立节点左右位置   */
  45.          btree[level].left = i;     /* 链结左子树         */
  46.       else
  47.          btree[level].right = i;    /* 链结右子树         */
  48.    }
  49. }
  50. /* ---------------------------------------- */
  51. /*  主程式: 建立结构数组的二叉树状结构.     */
  52. /*  数字-1表示没有下一阶层.                 */
  53. /* ---------------------------------------- */
  54. void main()
  55. {
  56.    /* 二叉树节点数据 */
  57.    int data[10] = { 5, 6, 4, 8, 2, 3, 7, 1, 9 };
  58.    int i;
  59.    for ( i = 0; i < 15; i++ )       /* 清除树状结构数组   */
  60.    {
  61.       btree[i].data = 0;            /* 设定初始内容       */
  62.       btree[i].left = -1;           /* 设定初始内容       */
  63.       btree[i].right = -1;          /* 设定初始内容       */
  64.    }
  65.    createbtree(data,9);            /* 建立二叉树         */
  66.    printf("    左  数据  右n");
  67.    printf("----------------- n");
  68.    for ( i = 0; i < 15; i++ )       /* 列出二叉树内容     */
  69.       if ( btree[i].data != 0 )     /* 是否是树的节点     */
  70.          printf("%2d:[%2d] [%2d] [%2d]n",i,btree[i].left,
  71.                  btree[i].data,btree[i].right);
  72. }