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

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程式实例: 7_11.c                      */
  3. /*    表达式二叉树的建立和计值              */
  4. /* ======================================== */
  5. #include <stdlib.h>
  6. struct tree                       /* 树的结构宣告       */
  7. {
  8.    char 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 > 7 )   /* 终止条件       */
  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. void inorder(btree ptr)
  38. {
  39.    if ( ptr != NULL )             /* 终止条件           */
  40.    {
  41.       inorder(ptr->left);         /* 左子树             */
  42.       printf("%c",ptr->data);     /* 列印节点内容       */
  43.       inorder(ptr->right);        /* 右子树             */
  44.    }
  45. }
  46. /* ---------------------------------------- */
  47. /*  表达式二叉树前序列印                    */
  48. /* ---------------------------------------- */
  49. void preorder(btree ptr)
  50. {
  51.    if ( ptr != NULL )             /* 终止条件           */
  52.    {
  53.       printf("%c",ptr->data);     /* 列印节点内容       */
  54.       preorder(ptr->left);        /* 左子树             */
  55.       preorder(ptr->right);       /* 右子树             */
  56.    }
  57. }
  58. /* ---------------------------------------- */
  59. /*  表达式二叉树后序列印                    */
  60. /* ---------------------------------------- */
  61. void postorder(btree ptr)
  62. {
  63.    if ( ptr != NULL )             /* 终止条件           */
  64.    {
  65.       postorder(ptr->left);       /* 左子树             */
  66.       postorder(ptr->right);      /* 右子树             */
  67.       printf("%c",ptr->data);     /* 列印节点内容       */
  68.    }
  69. }
  70. /* ---------------------------------------- */
  71. /*  表达式二叉树后序计值                    */
  72. /* ---------------------------------------- */
  73. int cal(btree ptr)
  74. {
  75.    int operand1 = 0;              /* 前运算元变数       */
  76.    int operand2 = 0;              /* 后运算元变数       */
  77.    /* 终止条件 */
  78.    if ( ptr->left == NULL && ptr->right == NULL )
  79.       return ptr->data-48;
  80.    {
  81.       operand1 = cal(ptr->left);  /* 左子树             */
  82.       operand2 = cal(ptr->right); /* 右子树             */
  83.       return getvalue(ptr->data,operand1,operand2);
  84.    }
  85. }
  86. /* ---------------------------------------- */
  87. /*  计算二叉表达式的值                      */
  88. /* ---------------------------------------- */
  89. int getvalue(int op,int operand1,int operand2)
  90. {
  91.    switch ( (char) op )
  92.    {
  93.       case '*': return ( operand2 * operand1 );
  94.       case '/': return ( operand2 / operand1 );
  95.       case '+': return ( operand2 + operand1 );
  96.       case '-': return ( operand2 - operand1 );
  97.    }
  98. }
  99. /* ---------------------------------------- */
  100. /*  主程式: 建立表达式二叉树后计算结果.     */
  101. /* ---------------------------------------- */
  102. void main()
  103. {
  104.    btree root = NULL;             /* 表达式二叉树指标   */
  105.    int result;                    /* 结果变数           */
  106.    /* 表达式二叉树节点数据 */
  107.    int data[8] = { ' ', '+', '*', '*', '5',
  108.                    '6', '4', '3' };
  109.    root = createbtree(data,1);    /* 建立表达式二叉树   */
  110.    printf("中序表达式: ");
  111.    inorder(root);                 /* 中序列印二叉树     */
  112.    printf("n前序表达式: ");
  113.    preorder(root);                /* 前序列印二叉树     */
  114.    printf("n后序表达式: ");
  115.    postorder(root);               /* 后序列印二叉树     */
  116.    result = cal(root);            /* 计算结果           */
  117.    printf("n表达式结果是:%dn",result); /* 印出结果    */
  118. }