二叉树与表达式

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

要求:

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     }

 

四、程序介绍:

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

 

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

欢迎批评指正

 

 

 

转载于:https://www.cnblogs.com/shdwin/p/11066963.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值