二叉树--请设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。

/*
		 *
	  /     \
     +       *
    / \     / \
   a   b   c   -  
                \   
                 d
(a+b)*(c*(-d))
*/
typedef struct node{
	char data[10];
	struct node *left,*right;
}BTree;
/*树的习题还是离不开4种遍历,以及我发现递归用的比非递归多好多,拿到树先大概试一试4种遍历的次序哪个更接近想要的结果,发现中序遍历结果更合适,于是定下基本论调是中序遍历*/
void BtreeToE(BTree *root){
	BtreeToExp(root,1);
}
/*除了根结点和叶子结点以外,遍历其他结点左子树时,先输出左括号。遍历完右子树后,输出右括号即可*/
void BtreeToExp(Btree *T,int deep){
	if(T==NULL)
		return;
	else if(T->left==NULL&&T->right==NULL)//叶子结点输出其值
		printf("%s",T->data);
	else{
		if(deep>1)	//非树根节点,非叶子结点,遍历左子树前,输出左括号
			printf("(");
		BtreeToExp(T->left,deep+1);
		printf("%s",T->data);	//子树的根节点,输出操作符
		BtreeToExp(T->right,deep+1);	
		if(deep>1)	//非树根节点,遍历完右子树,输出右括号
			printf(")");
	}
}

二叉树的习题,真的是到处充斥着遍历的变型,而且用到最多的基本都是递归遍历的改编,而递归又恰巧是我最大的弱项…总的来说…还是多练习吧。
这道题我能想到需要中序遍历,于是手撸上去了中序的非递归遍历,然后对加括号的问题傻住了,但其实非递归遍历应该还是有办法做的吧。总之王道给出的答案,大部分都是对应的递归遍历,而且貌似写出递归遍历就能给满分?所以还是需要多加思考多加练习,熟能生巧吧。

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值