描述
设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,按此方法创建两棵二叉树,然后编写递归算法判断这两棵树是否相等。
输入
多组数据,每组数据有两行。每行为一个二叉树的先序序列(序列中元素为‘0’时,表示该结点为空)。当输入只有一个“0”时,输入结束。
输出
每组数据输出一行。若两个二叉树相等输出“YES”,否则输出“NO”。
#include<iostream>
#include<string>
using namespace std;
typedef struct node {
char data;
node* lchild, * rchild;
}*bitree;
//根据先序序列构建二叉树
void creat_tree(bitree& t, char* str,int &num) {
//cout << str[num];
if (str[num] != '\0') {
if (str[num] == '0') {
t = NULL;
//cout << 0;
}
else {
//cout << str[num];
t = new node;
t->data = str[num];
//cout << t->data;
creat_tree(t->lchild, str, ++num);
creat_tree(t->rchild, str, ++num);
}
}
else
exit(0);
}
//中序遍历
void mid_trave(bitree t, char* str,int &n) {
if(t!=NULL){
mid_trave(t->lchild, str, n);
str[n++] = t->data;//会出现乱码,所以在字符最后要赋值一个"\0"标识结束
//cout << t->data;//直接输出没问题,不会出现乱码
mid_trave(t->rchild, str, n);
}
}
int main() {
int* result;
result = new int[100];
int i = 0;
while (1) {
int num1 = 0, num2 = 0;
int n1 = 0, n2 = 0;
char* str1 = NULL;
char* str2 = NULL;
char* mid_str1 = NULL, * mid_str2 = NULL;//中序序列
mid_str1 = new char[10];
mid_str2 = new char[10];
str1 = new char[100];
str2 = new char[100];
bitree t1, t2;
t1 = new node;
t2 = new node;
cin >> str1;
if (str1[0]=='0') break;
cin >> str2;
creat_tree(t1, str1, num1);
creat_tree(t2, str2, num2);
//cout << num1 << num2;
//cout << t1->rchild->data;
mid_trave(t1, mid_str1, n1);
mid_trave(t2, mid_str2, n2);
mid_str1[n1] = '\0';//很重要!!!在这个地方被卡了很久
mid_str2[n2] = '\0';
//cout << mid_str1;//如果不加结尾,直接输出char*, 会出现乱码
//cout << mid_str2;
result[i] = 1;
//cout << result[i];
//挨个进行字符串匹配
if (num1 == num2) {
for (int j = 0; j < n1; j++) {
if (mid_str1[j] != mid_str2[j])
{
//cout << 0;
result[i] = 0; break;//不匹配
}
}
}
else result[i] = 0;
i++;
}
for (int j = 0; j < i; j++) {
if (result[j] == 1)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}