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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 7_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 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 copybtree(btree root)
  38. {
  39.    btree newnode;                 /* 新节点指标         */
  40.    if ( root == NULL )            /* 终止条件           */
  41.       return NULL;
  42.    else
  43.    {
  44.       /* 建立新节点记忆体 */
  45.       newnode = ( btree ) malloc(sizeof(treenode));
  46.       newnode->data = root->data; /* 建立节点内容       */
  47.       /* 拷贝左子树 */
  48.       newnode->left = copybtree(root->left);
  49.       /* 拷贝右子树 */
  50.       newnode->right = copybtree(root->right);
  51.       return newnode;
  52.    }
  53. }
  54. /* ---------------------------------------- */
  55. /*  二叉树中序列印                          */
  56. /* ---------------------------------------- */
  57. void printbtree(btree ptr)
  58. {
  59.    if ( ptr != NULL )             /* 终止条件           */
  60.    {
  61.       printbtree(ptr->left);      /* 左子树             */
  62.       printf("[%2d]",ptr->data);  /* 列印节点内容       */
  63.       printbtree(ptr->right);     /* 右子树             */
  64.    }
  65. }
  66. /* ---------------------------------------- */
  67. /*  主程式: 建立二叉树后备份它.             */
  68. /* ---------------------------------------- */
  69. void main()
  70. {
  71.    btree root = NULL;             /* 原二叉树指标       */
  72.    btree backup = NULL;           /* 复制二叉树指标     */
  73.    /* 二叉树节点数据 */
  74.    int data[16] = { 0, 5, 4, 6, 2, 0, 0, 8, 1,
  75.                     3, 0, 0, 0, 0, 7, 9 };
  76.    root = createbtree(data,1);    /* 建立树状结构       */
  77.    backup = copybtree(root);      /* 复制二叉树         */
  78.    printf("原二叉树的节点内容 n");
  79.    printbtree(root);              /* 中序列印二叉树     */
  80.    printf("n备份二叉树的节点内容 n");
  81.    printbtree(backup);            /* 中序列印二叉树     */
  82.    printf("n");                  /* 换行               */
  83. }