- 题目要求
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);
}
}
}