第三部分 数据结构 -- 第三章 树1368:对称二叉树(tree_c)

1368:对称二叉树(tree_c)

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 2821 通过数: 1123
【题目描述】
如果二叉树的左右子树的结构是对称的,即两棵子树皆为空,或者皆不空,则称该二叉树是对称的。编程判断给定的二叉树是否对称.

例:如下图中的二叉树T1是对称的,T2是不对称的。

二叉树用顺序结构给出,若读到#则为空,二叉树T1=ABCDE,T2=ABCD#E,如果二叉树是对称的,输出“Yes”,反之输出“No”。

【输入】
二叉树用顺序结构给出,若读到#则为空。

【输出】
如果二叉树是对称的,输出“Yes”,反之输出“No”。

【输入样例】
ABCDE
【输出样例】
Yes


思路:1.从下表为1时开始遍历,每次+2,就会到另一棵子树的最左边,
2.判断每对同一节点的子节点,从第二个开始,因为第一个是根节点,给出的顺序中,同个节点的两个子节点是相邻的如果其中恰好有个是空的,它就不是对称二叉树。

#include<cstdio>
#include<iostream>
#include<cstring>
#define N 1001
using  namespace std;
char s[N];
int main(){
  
	cin >> s;
	int lena = strlen(s);
	s[lena] = '#';
	 bool flag1 = true;
	/*if(lena%2 == 0){//如节点个数为偶数,那么除根节点后
	cout <<"No" << endl;
	return 0;//剩余奇数个,无法满足两棵子树皆空或都不空
	}*/
	for(int i = 1; i < lena; i += 2){
		if((s[i] =='#' && s[i+1] !='#') || (s[i+1] =='#'&&s[i] !='#'))
		{//判断每对同一节点的子节点,从第二个开始,因为第一个是根节点,给出的顺序中,同个节点的两个子节点是相邻的如果其中恰好有个是空的,它就不是对称二叉树。
			flag1 = false;
			break;
		}
	}
	if(flag1)
	cout << "Yes" << endl;
	else
    cout << "No" << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章