免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
二分探索木で7-4している(25ポイント)
挿入の与えられたシーケンスは一意に二分探索木を求めることができます。しかし、二分探索木を与え、異なる挿入配列の多様から得ることができます。2は、それぞれ、配列に従って{例えば、1、3}と{2、3、1}は同じ結果が得られた、最初は空でバイナリ検索ツリーに挿入されています。このように様々な入力のための挿入配列は、あなたは彼らが同じ二分探索木を生成することができるかどうかを判断する必要があります。
入力フォーマット:
テストデータ入力の複数のグループを含みます。最初のデータの各行は、それぞれ、2つの正の整数N(≤10)およびLが与えられ、各挿入配列要素の数列の数を確認する必要があることです。2行目は、最初の挿入配列として、スペースで区切られた正の整数Nを示しています。最終的にL行、各行は配列が確認する必要がLに属するN個の挿入要素を与えます。
簡単にするために、我々は、各インサートはNに1の配列が配置されていることを確認してください。Nを読み取るために0であるとき、それは処理されていないデータのこのセット、入力の終了を示します。
出力フォーマット:
それは同じ順序で生成され、対応する初期シーケンスのバイナリ検索ツリーを生成した場合、各グループをチェックする必要があり、出力「はい」、そうでない場合は「いいえ」。
サンプル入力:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
出力例:
Yes
No
No
#include<iostream>
#include <map>
using namespace std;
struct Node{
int left, right;
};
struct Tree {
map<int, Node> tree;
int root = 0;
Tree(int n) {
int tmp;
for (int i = 0; i < n; ++i) {
cin >> tmp;
insert(tmp);
}
}
void insert(int& t) {
int* k = &root;
while (*k!=0)
k = (t < *k ? &tree[*k].left : &tree[*k].right);
*k = t;
}
bool operator ==(Tree& other) {
if (tree.size() != other.tree.size() || root != other.root)
return false;
for (auto& it : other.tree) {
if(it.second.left!=tree[it.first].left|| it.second.right != tree[it.first].right)
return false;
}
return true;;
}
};
int main(){
int n, l;
while (cin >> n >> l) {
Tree refer(n);
for (int i = 0; i < l; ++i) {
Tree cTree(n);
cout << (cTree == refer ? "Yes" : "No") << endl;
}
}
return 0;
}