• 二叉树与表达式


    将通过二叉链表实现的表达式二叉树进行输出,同时计算出结果。

    要求:

    1)二叉树建立时,使用先序建立;

    2)四个运算符包括:+, -, *, /;

    3 ) 在输出时,遇到优先级问题时,相应的括号也要输出。

    提示:

    1)递归执行下列步骤即可求值:先分别求出左子树和右子树表示的子表达式的值,最后根据根结点的运算符的要求,计算出表达式的最后结果。

    2)二叉树的中序遍历序列与原算术表达式基本相同,但是需要将中序序列加上括号,即当根结点运算符优先级高于左子树(或右子树)根结点运算符时,就需要加括号。

    例如:

    输入Result
    -+3@@*2@@-4@@1@@/6@@2@@
    3+2*(4-1)-6/2=6
    *3@@+/6@@2@@-3@@1@@
    
    3*(6/2+3-1)=15
    

    本题可以利用谦虚遍历以及中序遍历的特点来实现

    详见代码。

     

     

    一、首先构建二叉树:

     1 class Node
     2 {
     3     friend Tree;
     4 public:
     5     Node():Lc(NULL),Rc(NULL) {}
     6     Node(char d,Node *l=NULL,Node *r=NULL)//析构函数,设定优先级
     7     {
     8         data=d;
     9         Lc=l;
    10         Rc=r;
    11         if (data >= '0' && data <= '9')
    12             num = data - '0', op = 0;
    13         else if (data == '*')
    14             op = 3;
    15         else if (data == '+')
    16             op = 1;
    17         else if (data == '-')
    18             op = 1;
    19         else if (data == '/')
    20             op = 3;
    21     }
    22 
    23 private:
    24     Node *Lc,*Rc;
    25     char data;
    26     int num,op;
    27 
    28 
    29 };
    30 class Tree
    31 {
    32 public:
    33     friend Node;
    34     Tree():root(NULL) {}
    35     Tree(char value )//析构函数
    36     {
    37         Trv=value;
    38         root = NULL;
    39 
    40 
    41     }
    42 private:
    43     Node *root;//根节点
    44     char Trv;
    45 
    46 };

    二、输入表达式

     1     void  input(Node *&p)
     2     {
     3         char d;
     4         cin>>d;
     5         if(d!='@')
     6         {
     7             p = new Node(d);//前插法
     8             input(p->Lc);
     9             input(p->Rc);
    10         }
    11         else
    12         {
    13             p=NULL;
    14         }
    15     }

    三、进行计算输出(主要)

     1 int LVR(Node *p)//中序遍历
     2     {
     3         if(p->op==0)//如果操作数为0,为数字,返回运算结果
     4         {
     5             cout<<p->data;
     6             return p->num;
     7         }
     8         else      //否则进行运算
     9         {
    10             int a;//对左子树进行运算
    11             if(p->Lc->op&&p->Lc->op<p->op)//如果左孩子操作数存在,并且优先级高于本身则输出括号
    12             {
    13                 printf("(");
    14                 a=LVR(p->Lc);//递归括号内容并进行计算
    15                 printf(")");
    16             }
    17             else
    18             {
    19                 a=LVR(p->Lc);//否则进行递归计算
    20             }
    21             cout<<p->data;输出等式
    22             int b;//同左子树
    23             if(p->Rc->op&&p->Rc->op<p->op)
    24             {
    25                 printf("(");
    26                 b=LVR(p->Rc);
    27                 printf(")");
    28             }
    29             else
    30             {
    31                 b=LVR(p->Rc);
    32             }
    33             if(p->data=='+')
    34             {
    35                 return a+b;
    36             }//进行计算+,同时return 结果
    37             else if(p->data=='-')
    38             {
    39                 return a-b;
    40             }//进行计算-,同时return 结果
    41             else if(p->data=='*')
    42             {
    43                 return a*b;
    44             }//进行计算*,同时return 结果
    45             else if(p->data=='/')
    46             {
    47                 return a/b;
    48             }//进行计算/,同时return 结果
    49 
    50         }
    51 
    52     }

    四、程序介绍:

    本程序主要利用了递归、前序遍历、中序遍历的特点来实现表达式的求知。对于刚刚学习的同学来说可能稍微难理解,一些简单的注释有助于大家理解。

    本人水平很低,复习数据结构对原来的代码进行整理。

    欢迎批评指正

     

     

  • 相关阅读:
    ubuntu
    什么是守护进程?
    Redis 简介
    什么是原子性,什么是原子性操作?
    什么是BSD协议?
    查看内存
    数据库备份与还原
    PostgreSQL 判断字符串包含的几种方法
    SQL 基础
    手风琴-过渡效果,显示隐藏列表案例
  • 原文地址:https://www.cnblogs.com/shdwin/p/11066963.html
Copyright © 2020-2023  润新知