04-树4 是否同一棵二叉搜索树
2016-03-22 23:07
435 查看
二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2,1,3}和{2,3,1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2,1,3}和{2,3,1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N(≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。输入样例:
42 3142 3412 3241 21 21 12 0
输出样例:
Yes No No
//建一颗树,判别其他序列是否与其一致 #include<stdio.h> #include<stdlib.h> typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedefintElemType;/*ElemType类型根据实际情况而定,这里假设为int*/ typedefstructTreeNode*Tree; structTreeNode { ElemTypedata; Treeleft,right; intflag;//被访问过为1否则0 }; TreeNewNode(ElemTypedata); TreeInsert(TreeT,ElemTypedata); TreeMakeTree(intN); boolcheck(TreeT,ElemTypedata); intJudge(TreeT,intN); voidResetT(TreeT); voidFreeTree(TreeT); TreeNewNode(ElemTypedata) { TreeT=(Tree)malloc(sizeof(structTreeNode)); T->data=data; T->left=T->right=NULL; T->flag=0; returnT; } TreeInsert(TreeT,ElemTypedata) { if(!T) T=NewNode(data); else{ if(data>T->data) T->right=Insert(T->right,data); else T->left=Insert(T->left,data); } returnT; } TreeMakeTree(intN) { TreeT; ElemTypedata; scanf("%d",&data); T=NewNode(data); for(inti=1;i<N;i++){ scanf("%d",&data); T=Insert(T,data); } returnT; } boolcheck(TreeT,ElemTypedata) { if(T->flag){ if(data<T->data) returncheck(T->left,data); elseif(data>T->data) returncheck(T->right,data); }else{ if(data==T->data){//是要找的结点 T->flag=1; returntrue; } elsereturnfalse;//不是不一致 } } intJudge(TreeT,intN) { ElemTypedata; intflag=0;//0代表目前仍一致1代表已经不一致 scanf("%d",&data); if(data!=T->data)//判断根节点是否一致 flag=1; elseT->flag=1; for(inti=1;i<N;i++){//确保L读完 scanf("%d",&data); if((!flag)&&(!check(T,data)))//不一致 flag=1; } if(flag)//不一致 return0; elsereturn1; } voidResetT(TreeT)//清除T中各结点的flag标记 { if(T->left) ResetT(T->left); if(T->right) ResetT(T->right); T->flag=0; } voidFreeTree(TreeT)//释放T的空间 { if(T->left) FreeTree(T->left); if(T->right) FreeTree(T->right); free(T); } intmain() { intN,L; TreeT; scanf("%d",&N); while(N){ scanf("%d",&L); T=MakeTree(N); for(inti=0;i<L;i++){ if(Judge(T,N)) printf("Yes\n"); else printf("No\n"); ResetT(T);//清除T中的标记flag } FreeTree(T); scanf("%d",&N); } return0; }
相关文章推荐
- 个人项目 - 词频统计
- 设置xml文件 提示
- Activity生命周期
- 素数环问题 HDU1016 DFS深搜
- Transitioning to ARC Release Notes
- 心得
- vm virtualbox安装mac
- 领域驱动设计-入门
- 作业4——————
- 读取程序中行数、单词数、字符数程序
- String类
- 我的算法学习之路
- x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()
- x264代码剖析(十四):核心算法之宏块编码函数x264_macroblock_encode()
- 取消与利用冒泡
- 递归算法转换为非递归算法
- 第一篇博客
- IOS开发-ObjC-NSString
- 《Linux内核设计与实现》读书笔记 第十八章 调试
- Android中简单列表对话框问题