04-树4 是否同一棵二叉搜索树 (25分)

来源:互联网 发布:淘宝直通车关键词价格 编辑:程序博客网 时间:2024/06/04 19:00


#include<iostream> using namespace std;  struct TreeNode{int data;TreeNode * lchild;TreeNode * rchild;int flag;//0表示未访问过,1访问过 };TreeNode * NewTreeNode(int tmp){TreeNode * T=new TreeNode;T->data=tmp;  T->lchild=T->rchild=NULL;T->flag=0;return T; }TreeNode * Insert(TreeNode * T,int tmp){if(!T) T=NewTreeNode(tmp);else{                        //这个else必须要 if(tmp>T->data) T->rchild=Insert(T->rchild,tmp);else  T->lchild=Insert(T->lchild,tmp);}return T;}TreeNode * MakeTree(int N){int tmp; cin>>tmp;TreeNode * T=NewTreeNode(tmp);//创建根节点 for(int i=1;i<N;i++){ //创建其它节点 cin>>tmp;T=Insert(T,tmp);} return T;}     bool Check(TreeNode * T,int tmp){if(T->flag){if(tmp>T->data) return Check(T->rchild,tmp); else if(tmp<T->data)  return Check(T->lchild,tmp); else return false;}else{if(tmp==T->data){T->flag=1;return true;}else  return false;} }    bool Judge(TreeNode * T,int N){int flag=0;//0表示当前还一致,1表示当前已经不一致 int tmp;cin>>tmp;if(T->data!=tmp) flag=1;else T->flag=1;//访问过//cout<<flag<<" ";  for(int i=1;i<N;i++){cin>>tmp;//cout<<Check(T,tmp)<<" ";if( (!flag) && (!Check(T,tmp)) ) flag=1; //!flag表示当前还一致, !Check(T,tmp)表示接下来产生了不一致  !要打(),因为!优先级高于&& } if(flag) return false;else  return true;}void Reset(TreeNode * T){T->flag=0;if(T->lchild) Reset(T->lchild);if(T->rchild) Reset(T->rchild);}  void FreeTree(TreeNode * T){if(T->lchild) FreeTree(T->lchild);if(T->rchild) FreeTree(T->rchild);delete(T);}     int  main(){  //freopen("input.txt","r",stdin);int N,L;cin>>N;   while(N){  //if cin>>L;  //这句要在建树之前,因为建树也要读取数据 TreeNode * T=MakeTree(N); for(int i=0;i<L;i++){if(Judge(T,N)) cout<<"Yes"<<endl;else  cout<<"No"<<endl;Reset(T);//清除T中标记的flag,都初始化为0}FreeTree(T); cin>>N;//换一颗树 }return 0;  }  







原创粉丝点击