表达式树——中序打印输出

给出一个表达式树,输出其中序表达式,需要用括号来区分优先顺序(貌似是408真题,感觉自己递归没有学好,只会用栈实现,也不知道对不对,求大神纠错)

在这里插入图片描述

如图所给出表达式,输出为(a+(b*(-d)-(e/f))

  1. 算法分析
    (一)若当前结点是左子树上的叶子结点,输出左括号以及数据
    在这里插入图片描述
    (二)若当前结点是根节点直接输出数据
    在这里插入图片描述
    (三)若当前结点有右子树但左子树为空,则输出左括号以及根节点数据
    在这里插入图片描述
    (四)若当前结点为右子树上的叶节点,输出右括号以及数据
    在这里插入图片描述
  2. 代码实现
//非递归中序遍历思想
void print(Bitree T){
	if(!T) return ;//树为空退出函数
	Stack s;		//声明一个栈
	BiTNode *p=T;
	int flag=1;		//判断当前在左或右子树的标志
	print('(');
	while(p||!IsEmpty(s)){	//当前结点不为空或者栈不为空
		if(p){
			push(s,p);   //左子树不空,继续遍历左子树
			p=p->lchild;
			flag=1;  //标志当前遍历的是左子树
		}
		else{	// 左到底了
			pop(s,p);//出栈;
			if((!p->lchild&&!p->rchild&&flag))||(!p->lchild&&p->rchild)){//第一种及第四种情况
				print('(');
				print(p->data);
			}
			else if(p->lchild&&p->rchild)//第二种情况
				print(p->data);
			else if(!flag){//第三种情况
				print(')');
				print(p->data);
			}
			p=p->rchild;//判断后往右走
			flag=0;
		}//while
		print(')');
	}//print	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值