[C/C++]利用中缀表达式建立二叉树,并求后缀表达式

通常来说可以通过中缀表达式直接求得后缀表达式的。但是题目里要求先建树再利用二叉树求后缀表达式,在此记录一下。

思想:可分成如下步骤:

(1)从当前传入的表达式中找出不在括号内最靠后优先级最低的一个运算符,这就是当前的根节点,并记录其位置

(2)利用上一步的运算符建立根节点,其左右子树分别赋值为此函数返回值,传入参数分别为选中运算符的左侧部分和右侧部分

(3)返回当前根节点

// 比较两个运算符的优先级
// -1:s1<s2  0:s1==s2  1:s1>s2
int compare(string s1, string s2){
	if(s1.empty()){
		return 1;
	}
	
	if((s1=="+" || s1=="-" )&& (s2=="*" || s2=="/")){
		return -1;
	}
	if(((s1=="+" || s1=="-") && (s2=="+" || s2=="-")) ||
		((s1=="*" || s1=="/") && (s2=="*" || s2=="/"))){
			return 0;
		}
	if((s1=="*" || s1=="/") && (s2=="+" || s2=="-")){
		return 1;
	}
}

BiTree createTree(vector<string> data, int start, int end){
	// 去掉最外侧括号
	if(data[start] == "(" && data[end] == ")"){
		start++; end--;
	}
	
	BiTree T = new BiTNode;
	int size = end-start+1;
	
	if(size <= 0){
		return NULL;
	} 
	
	// 长度为1, 数字直接作为叶结点
	else if(size == 1){
		T->s = data[start];
		T->lchild = T->rchild = NULL; 
		return T;
		
	} else {
		string chosen;   // 记录选中的运算符
		int lcount = 0, mid;  // lcount记录左括号数量,mid记录选中运算符位置
		for(int i=start; i<=end; i++){
			if(data[i] == "(") lcount++;  // 这两行用于记录括号匹配是否结束
			if(data[i] == ")") lcount--;
			
			// isFour()用于判断是否是四则运算符, lcount==0表示外层不存在括号, 
			// compare()用于比较两运算符优先级 
			if(isFour(data[i]) && lcount==0 && compare(chosen, data[i]) != -1){
				chosen = data[i];  mid = i;
			}
		}
		T->s = chosen;
		// 对左右子树分别赋值,递归调用此函数 
		T->lchild = createTree(data, start, mid-1);
		T->rchild = createTree(data, mid+1, end);
		return T;
	}
}

该二叉树的后序遍历序列即为后缀表达式

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值