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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 7_3_3.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. void printbtree(btree root)
  64. {
  65.    btree ptr;
  66.    ptr = root->left;
  67.    printf("列印左子树:n");
  68.    while ( ptr != NULL )          /* 列印回路           */
  69.    {
  70.       printf("[%2d]n",ptr->data);  /* 列印节点内容     */
  71.       ptr = ptr->left;            /* 左子节点           */
  72.    }
  73.    ptr = root->right;
  74.    printf("列印右子树:n");
  75.    while ( ptr != NULL )          /* 列印回路           */
  76.    {
  77.       printf("[%2d]n",ptr->data);  /* 列印节点内容     */
  78.       ptr = ptr->right;           /* 右子节点           */
  79.    }
  80. }
  81. /* ---------------------------------------- */
  82. /*  主程式: 建立链结的二叉树且列印出来.     */
  83. /* ---------------------------------------- */
  84. void main()
  85. {
  86.    btree root = NULL;             /* 树根指标           */
  87.    /* 二叉树节点数据 */
  88.    int data[10] = { 5, 6, 4, 8, 2, 3, 7, 1, 9 };
  89.    root = createbtree(data,9);    /* 建立二叉树         */
  90.    printf("树的节点内容 n");
  91.    printbtree(root);              /* 列出二叉树内容     */
  92. }