04-树4 是否同一棵二叉搜索树 (25 分)
题目很简单,但是我还是遇到了一些问题。
总之,我的思路是先建树,然后使用队列对树的每一个结点进行比较。
#include<iostream>
#include<queue>
using namespace std;
class SearchTree
{
int Key;
SearchTree* left;
SearchTree* right;
public:
SearchTree(int key = -1)
{
Key = key;
left = nullptr;
right = nullptr;
};
void Insert(int key)
{
if (Key==-1)
{
Key = key;
}
if (Key > key)
{
if (left == nullptr)
left = new SearchTree(key);
else
left->Insert(key);
}
else if (Key < key)
{
if (right == nullptr)
right = new SearchTree(key);
else
right->Insert(key);
}
else
return;
}
friend void DeleteTree(SearchTree* tree);
SearchTree* getleft()
{
return left;
}
SearchTree* getright()
{
return right;
}
int getkey()
{
return Key;
}
bool operator==(SearchTree t)
{
if (Key == t.Key)
{
if (left && t.left && right && t.right)
{
if (left->Key == t.left->Key && right->Key == t.right->Key)
return true;
else
return false;
}
if (left == nullptr && t.left == nullptr && right && t.right)
{
if (right->Key == t.right->Key)
return true;
else
return false;
}
if (right == nullptr && t.right == nullptr && left && t.left)
{
if (left->Key == t.left->Key)
return true;
else
return false;
}
return true;
}
else
{
return false;
}
}
};
void DeleteTree(SearchTree* tree)
{
if (tree->left != nullptr) DeleteTree(tree->left);
if(tree->right != nullptr)DeleteTree(tree->right);
if (tree->left == nullptr && tree->right == nullptr)
delete tree;
}
int main()
{
int N, L;
cin >> N;
while (N)
{
cin >> L;
//int ints[10][10] = {0};
int i = 0;
SearchTree* Trees = new SearchTree[L + 1];
queue<SearchTree>* qs = new queue<SearchTree>[L + 1];
while (i < L + 1)
{
SearchTree* tree = Trees + i++;
int n = 0;
while (n < N)
{
int temp;
cin >> temp;
if (tree == nullptr)
tree = new SearchTree(temp);
else
tree->Insert(temp);
n++;
}
}
bool* flag = new bool[L+1];
i = 1;
while (i < L + 1)
{
if (!qs->empty())
{
qs->pop();
}
qs->push(*Trees);
flag[i] = true;
(qs + i)->push(*(Trees + i));
while ((!qs->empty() && !(qs + i)->empty()))
{
SearchTree t1 = qs->front();
SearchTree t2 = (qs + i)->front();
if (t1 == t2)
{
qs->pop();
(qs + i)->pop();
if (t1.getleft() != nullptr)
{
qs->push(*(t1.getleft()));
(qs + i)->push(*(t2.getleft()));
}
if (t1.getright() != nullptr)
{
qs->push(*(t1.getright()));
(qs + i)->push(*(t2.getright()));
}
}
else
{
flag[i] = false;
break;
}
}
if (qs->empty() != (qs + i)->empty())
flag[i] = false;
i++;
}
for (int i = 1; i < L + 1; i++)
{
if (flag[i])
cout << "Yes" << endl;
else
cout << "No" << endl;
}
delete[] Trees;
delete[] qs;
delete[] flag;
cin >> N;
}
return 0;
}
不知道问题出在哪儿,测试点通过情况为:
这个多组合不知道是什么意思,这个测试点始终没通过,希望有大神帮忙看看。