北林oj263基于二叉链表的树结构相等的判断

描述

设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,按此方法创建两棵二叉树,然后编写递归算法判断这两棵树是否相等。

输入

多组数据,每组数据有两行。每行为一个二叉树的先序序列(序列中元素为‘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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值