题目要求 04-树4 是否同一棵二叉搜索树 (25分)分析 我的基本思路是先构建参考树。然后对剩下的输入序列直接判断能否正确地在参考树上检索到。如果是可以,说明是同一棵二叉搜索树,否则不是。 其实还是可以用结构体数组来存储树,我认为用数组存储比用链表存储简单一些。 其次树的大部分操作都可以用递归的方式来处理。如树的插入,序列的检索。我的代码
#include <iostream>
using namespace std;
#define Null -1
struct Node{
int data;
int left;
int right;
};
int const maxn =
10;
struct Node tree[maxn];
bool checked[maxn];
int insert(
int root,
int i,
int data);
bool find(
int root,
int data);
int main(
int argc,
const char * argv[]) {
int N,L;
while (
true) {
cin>>N;
if(N ==
0)
break;
cin>>L;
int root = Null,data;
for(
int i=
0; i<N; i++){
cin>>data;
root = insert(root, i, data);
}
for(
int j=
0; j<L; j++){
bool flag =
true;
for(
int i=
0; i<N; i++){
checked[i] =
false;
}
for(
int i=
0; i<N; i++){
cin>>data;
if(!flag)
continue;
flag = find(root,data);
}
if(flag){
cout<<
"Yes"<<endl;
}
else{
cout<<
"No"<<endl;
}
}
}
return 0;
}
int insert(
int root,
int i,
int data){
if(root == Null){
tree[i].data = data;
tree[i].left = Null;
tree[i].right = Null;
root = i;
}
else{
if(data > tree[root].data){
tree[root].right = insert(tree[root].right, i, data);
}
else{
tree[root].left = insert(tree[root].left, i, data);
}
}
return root;
}
bool find(
int root,
int data){
if(!checked[root] && tree[root].data!=data){
return false;
}
else if (!checked[root] && tree[root].data==data){
checked[root] =
true;
return true;
}
else{
if(tree[root].data < data){
return find(tree[root].right,data);
}
else{
return find(tree[root].left,data);
}
}
}