9 도 OJ 1009:이 진 트 리 두 그루 나무 판 등+이 진 트 리 구축

절 대의 이 연구 에 서 는 두 개의 서열 을 정 해 이 두 서열 로 구 성 된 이 진 트 리 가 같 는 지 를 판단 하 는 것 이 대의 다.
    관건 은 나 무 를 짓 는 과정 과 두 그루 의 나무 가 같은 지 판정 하면 된다 는 것 이다.두 그루 의 나무 가 같은 지 아 닌 지 를 판단 하 는 것 은 재 귀 로 해결 할 수 있 습 니 다.먼저 현재 의 결점 이 같 거나 모두 비어 있 는 지 를 보고 두 그루 의 나무의 상황 을 볼 수 있 습 니 다.
    제목 URL:http://ac.jobdu.com/problem.php?id=1009
    제 AC 코드 를 여러분 과 공유 하 겠 습 니 다.
#include<iostream>
#include<stdio.h>
using namespace std;

struct Node
{
	int d;
	Node *l, *r;

	Node(int data)
	{
		d = data;
		l = r = NULL;
	}
};

bool search(Node * root, Node *& fa, int key)
{
	if(!root) return false;
	else
	{
		while(root)
		{
			fa = root;
			if(key > root->d) root = root->r;
			else if(key < root->d) root = root->l;
			else return true;
		}
		return false;
	}
}

void insert(Node * &root, int key)
{
	if(!root)
	{
		root = new Node(key);
		return;
	}
	else 
	{
		Node *ins;
		if(!search(root, ins, key))
		{
			if(key > ins->d)	ins->r = new Node(key);
			else ins->l = new Node(key);
		}
	}
}

bool treeCom(Node *s, Node *t)
{
	if(!s && !t) return true;
	else if(!s || !t) return false;
	if(s->d != t->d) return false;

	if(treeCom(s->l, t->l) && treeCom(s->r, t->r)) return true;
}

int main()
{
	int n;
	Node *r, *s;
	char str[11];
	while(scanf("%d", &n) && n)
	{
		r = NULL;	
		scanf("%s", str);
		for(int i=0; i<10; i++)	insert(r, str[i] - '0');

		for(int i=0; i<n; i++)
		{
			s = NULL;
			scanf("%s", str);
			for(int i=0; i<10; i++)	insert(s, str[i] - '0');
			if(treeCom(r, s)) printf("YES
"); else printf("NO
"); } } system("pause"); return 0; }

좋은 웹페이지 즐겨찾기