Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

用二叉树表示表达式

来源: 未知 分享至:

  

先看中缀表达式的二叉树表示:

    

/*
* 中缀表达式 构建 二叉树
*
* 方法: 每次找到“最后计算”的运算符,作为当前树的根,然后递归处理
* 详见 刘汝佳《算法竞赛入门经典》 P198
*
*/
#include <iostream>
using namespace std;

const int maxn = 1000;

//每个节点的左右儿子编号
int lch[maxn], rch[maxn];
//节点的字符
char op[maxn];
//节点数
int cnt = 0;

//s的[x, y)作为范围
int buildTree(char *s, int x, int y){
//c1, c2分别记录出现在括号外的最右边的加减号和乘除号
int c1 = -1, c2 = -1, p = 0, u;

//当前表达式长度为1,则直接以此为一棵树
if(y - x == 1){
u = cnt++; //第u个节点
lch[u] = rch[u] = -1;
op[u] = s[x];
return u;
}

//p==0表示在括号外
for(int i=x; i<y; i++){
switch(s[i]){
case \'(\': p++; break;
case \')\': p--; break;
case \'+\': case \'-\':
if(p == 0) c1 = i; //p==0说明s[i]不在括号内
break;
case \'*\': case \'/\':
if(p == 0) c2 = i;
break;
}
}

if(c1 < 0) c1 = c2; //括号外没有 + 或 - ,则选括号外的 * 或 /
if(c1 < 0) return buildTree(s, x+1, y-1); //括号外也没有* 或 /, 说明表达式被一个括号括住,去括号

u = cnt++;
lch[u] = buildTree(s, x, c1);
rch[u] = buildTree(s, c1+1, y);
op[u] = s[c1];

return u;
}


int main(){




return 0;
}

下面是转的:

包括中缀、后缀、前缀用二叉树表示:

    


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史