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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 7_9.c                       */
  3. /*    建立线索化二叉树和中序遍历              */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct t_tree                     /* 树的结构宣告       */
  7. {
  8.    int data;                      /* 节点数据           */
  9.    int leftthread;                /* 是否是左线索化       */
  10.    int rightthread;               /* 是否是右线索化       */
  11.    struct t_tree *left;           /* 指向左子树的指标   */
  12.    struct t_tree *right;          /* 指向右子树的指标   */
  13. };
  14. typedef struct t_tree treenode;   /* 树的结构新型态     */
  15. typedef treenode *t_btree;        /* 宣告树节点指标型态 */
  16. /* ---------------------------------------- */
  17. /*  插入线索化二叉树的节点                    */
  18. /* ---------------------------------------- */
  19. t_btree insertnode(t_btree root,int value)
  20. {
  21.    t_btree newnode;               /* 新节点指标         */
  22.    t_btree current;               /* 目前树节点指标     */
  23.    t_btree parent;                /* 父节点指标         */
  24.    t_btree previous;              /* 后继节点指标       */
  25.    int pos;                       /* 保留走向           */
  26.    /* 建立新节点记忆体 */
  27.    newnode = ( t_btree ) malloc(sizeof(treenode));
  28.    newnode->data = value;         /* 建立节点内容       */
  29.    newnode->left = NULL;          /* 设定指标初值       */
  30.    newnode->right = NULL;         /* 设定指标初值       */
  31.    newnode->leftthread = 1;       /* 是线索化             */
  32.    newnode->rightthread = 1;      /* 是线索化             */
  33.    current = root->right;         /* 目前树根指标       */
  34.    if ( current == NULL )         /* 是否是树根         */
  35.    {
  36.       root->right = newnode;      /* 链结开头节点       */
  37.       newnode->left = root;       /* 指标指向指标root   */
  38.       newnode->right = root;      /* 指标指向指标root   */
  39.       return root;                /* 传回树根           */
  40.    }
  41.    parent = root;                 /* 父节点是开头节点   */
  42.    pos = 0;                       /* 设定走向           */
  43.    while ( current != NULL )      /* 寻找位置的回路     */
  44.    {
  45.       if ( current->data > value )  /* 比较节点值       */
  46.       {
  47.          if ( pos != -1 )         /* 走向不同           */
  48.          {
  49.             pos = -1;             /* 记录新走向         */
  50.             previous = parent;    /* 记录后继节点指标   */
  51.          }
  52.          parent = current;        /* 保留父节点指标     */
  53.          if ( current->leftthread == 0 ) /* 是否是线索化  */
  54.             current = current->left;     /* 左子树      */
  55.          else
  56.             current = NULL;       /* 是线索化             */
  57.       }
  58.       else
  59.       {
  60.          if ( pos != 1 )          /* 走向不同           */
  61.          {
  62.             pos = 1;              /* 记录新走向         */
  63.             previous = parent;    /* 记录后继节点指标   */
  64.          }
  65.          parent = current;        /* 保留父节点指标     */
  66.          if ( current->rightthread == 0 ) /* 是否是线索化 */
  67.             current = current->right;     /* 右子树     */
  68.          else
  69.             current = NULL;       /* 是线索化             */
  70.       }
  71.    }
  72.    if ( parent->data > value )    /* 接起父子的链结     */
  73.    {
  74.       parent->leftthread = 0;     /* 不是线索化           */
  75.       parent->left = newnode;     /* 是左子树           */
  76.       newnode->left = previous;   /* 指标指向previous   */
  77.       newnode->right = parent;    /* 指标指向parent     */
  78.    }
  79.    else
  80.    {
  81.       parent->rightthread = 0;    /* 不是线索化           */
  82.       parent->right = newnode;    /* 是右子树           */
  83.       newnode->left = parent;     /* 指标指向parent     */
  84.       newnode->right = previous;  /* 指标指向previous   */
  85.    }
  86.    return root;                   /* 传回树根指标       */
  87. }
  88. /* ---------------------------------------- */
  89. /*  建立线索化二叉树                          */
  90. /* ---------------------------------------- */
  91. t_btree createtbtree(int *data,int len)
  92. {
  93.    t_btree root = NULL;           /* 树根指标           */
  94.    int i;
  95.    /* 建立线索化二叉树的开头节点记忆体 */
  96.    root = ( t_btree ) malloc(sizeof(treenode));
  97.    root->left = root;             /* 设定指标初值       */
  98.    root->right = NULL;            /* 设定指标初值       */
  99.    root->leftthread = 1;          /* 是线索化             */
  100.    root->rightthread = 0;         /* 不是线索化           */
  101.    for ( i = 0; i < len; i++ )    /* 用回路建立树状结构 */
  102.       root = insertnode(root,data[i]);
  103.    return root;
  104. }
  105. /* ---------------------------------------- */
  106. /*  线索化二叉树中序遍历列印                  */
  107. /* ---------------------------------------- */
  108. void printtbtree(t_btree root)
  109. {
  110.    t_btree ptr;
  111.    ptr = root;                    /* 指向开头节点       */
  112.    do                             /* 中序遍历回路       */
  113.    {
  114.       if ( ptr->rightthread == 1 )  /* 右子节点是否是线索化 */
  115.          ptr = ptr->right;        /* 往右子树走         */
  116.       else
  117.       {
  118.          ptr = ptr->right;        /* 先到右子节点       */
  119.          while ( ptr->leftthread != 1 ) /*当左子节点不是线索化*/
  120.             ptr = ptr->left;      /* 往左子树走         */
  121.       }
  122.       if ( ptr != root )          /* 如果不是开头节点   */
  123.          printf("[%d]n",ptr->data);    /* 印出节点内容 */
  124.    } while ( ptr != root );       /* 直到找到开头节点   */
  125. }
  126. /* ---------------------------------------- */
  127. /*  主程式: 建立线索化二叉树且列印出来.       */
  128. /* ---------------------------------------- */
  129. void main()
  130. {
  131.    t_btree root = NULL;           /* 树根指标           */
  132.    /* 线索化二叉树节点数据 */
  133.    int data[9] = { 5, 6, 4, 8, 2, 3, 7, 1, 9 };
  134.    root = createtbtree(data,9);   /* 建立线索化二叉树     */
  135.    printf("线索化二叉树的节点内容 n");
  136.    printtbtree(root);             /* 列出二叉树内容     */
  137. }