【数据结构】-树-【2017真题】表达式树转中缀表达式

 

1.思路:按照中序遍历输出整棵树,并在适当的位置加上括号即可,关键在于如何加括号,第一次做题的时候没有想出来怎么加括号。

加括号的方法:观察表达式的结构可以知道,根节点将表达式分成左右两个部分,因此根节点不可能包含在任何一个括号内,并且只要不是叶子结点就说明有“子表达式”存在。除了叶子结点和根节点之外,在其他节点的左子树遍历之前加上左括号,在右子树遍历之后加上右括号。

因此算法就是对普通的中序遍历进行改进,改进过程关键是如何识别根节点和叶子结点。参考答案给出识别根节点的办法是对每一个结点求深度,深度=1就说明是根节点,判断叶子结点即判断是否有左右孩子。虽然不给出求深度的算法题目也会给满分,但是个人觉得有更好的办法标识根节点。那就是在第一次递归调用之前将真正的根节点存在全局变量中,遍历过程和全局变量比较,如果相同就说明此时是根节点。

BiTNode * t;
bool flag = true;

void convert(BiTree T) {
	if (flag) {
		t = T;
		flag = false;
	}

	if (T != NULL)
	{		
			if ((T->lchild||T->rchild)&&T!=t)cout << "(";
			convert(T->lchild);
			
			cout << T->data << " ";
			
			convert(T->rchild);
			if ((T->lchild || T->rchild)&&T != t)cout << ")";
		
	}
}

int main() {
	BiTree T;
	cout << "先序遍历创建二叉树" << endl;
	DLR_DG_createTree(T);

	cout << "层次遍历:";
	CC_printTree(T);
	cout << endl;
	
	convert(T);
}


    //* + a # # b # # * c # # - # d # #
    //+ * a # # b # # - # - c # # d # # 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页