3710 - 镜像

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

给一颗二叉树,可能是满二叉树,也可能是完全二叉树,你需要输出该二叉树的镜像(左右节点交换)

例如

原来的二叉树

<p class="MsoNormal">
	<span style="font-family:宋体;font-size:16px;">镜像的二叉树:</span>
</p>
<p class="MsoNormal">
	<img alt="" src="http://gzu.acmclub.com/attached/image/20150418/20150418194049_97545.png" /><span style="font-family:宋体;font-size:16px;">
</p>

<p>
	<br />
</p>
<p class="MsoNormal">
	&nbsp;
</p>

题目输入

一棵树由括号()包含,节点的值用数字或者字母表示。例如

(A(B(D)(E))(C(F)))

可以表示上图第一个二叉树

题目输出

包含多组测试数据

要求在每一行输出每个测试数据镜像二叉树的先序遍历每个节点间由空格隔开

A C E D B F

表示镜像树的先序

输入/输出样例

输入格式

(A(B(D)(E))(C(F)))

输出格式

A C F B E D

C++解答

#include <bits/stdc++.h>
using namespace std;

int kkk=0;

void print(char as[],int len)
{
	int i=1;
	
	if (kkk) printf(" ");
	else kkk=1;
	
	while(i<len-1){
		if (as[i]!='('&&as[i]!=')') printf("%c",as[i++]);
		else break;
	}

	char ad[305];
	char ak[305];
	int lend=0,lenk=0;
	
	int g=0;
	
	while(i<len-1){
		ad[lend++]=as[i];
		if (as[i]=='(') g++;
		if (as[i]==')') g--;
		i++;
		if (g==0) break;
	}
	ad[lend]='\0';
	g=0;
	
	while(i<len-1){
		ak[lenk++]=as[i];
		if (as[i]=='(') g++;
		if (as[i]==')') g--;
		i++;
		if (g==0) break;	
	}
	ak[lenk]='\0';
	
	if (lenk>0) print(ak,lenk);
	
	if (lend>0) print(ad,lend);
	
}

int main()
{
	//freopen("F:\\TestFiles\\test.in","r",stdin);
	//freopen("F:\\TestFiles\\test.out","w",stdout);
	char a[305];
	while(~scanf("%s",a)){
		kkk=0;
		int len=strlen(a);
		print(a,len);
		printf("\n");
	}
	return 0;
}