二叉搜索树的应用

来源:互联网 发布:数据库面试问答题 编辑:程序博客网 时间:2024/06/10 16:24
先给你第一个序列比如说是3,1,4,2,这四个数按照顺序建立一个二叉搜索树,然后再给你n个序列,问你这n个序列如果有序列能建立起来的二叉搜索树是和第一个序列一样的那就输出YES,否则就是NO,比如说3,1,4,2建立起来的搜索树是而3,2,4,1则是这就要输出NO。
#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;typedef struct tree{    int v;    int flag;    struct tree *Left,*Right;}*Tree;Tree NewNode(int V){    Tree T=(Tree)malloc(sizeof(struct tree));    T->v=V;    T->Left=T->Right=NULL;    T->flag=0;//没被访问过的    return T;}Tree Insert(Tree T,int V){    if(!T)        T=NewNode(V);//在空的搜索树上建立一个新结点    else    {        if(V>T->v)        T->Right=Insert(T->Right,V);//比根节点大插在右边        else            T->Left=Insert(T->Left,V);//比根节点小插在左边    }    return T;}Tree MakeTree(int N)//建搜索树{    Tree T;    int i,V;    scanf("%d",&V);    T=NewNode(V);//创建根结点    for(i=1;i<N;i++)    {        scanf("%d",&V);        T=Insert(T,V);//读入后面的数    }    return T;}int check(Tree T,int V){    if(T->flag)    {        if(V<T->v)             return check(T->Left,V);//看是否比结点小,如果是往左走        else if(V>T->v)//看是否比结点小,如果是往右走            return check(T->Right,V);        else            return 0;//这表示有两个一样的数了    }    else    {        if(V==T->v)        {            T->flag=1;            return 1;        }        else            return 0;    }}int Judge(Tree T,int N){    int i,V,flag=0;    scanf("%d",&V);    if(V!=T->v)        flag=1;//根结点不一样整个序列肯定不一样    else        T->flag=1;    for(i=1;i<N;i++)    {        scanf("%d",&V);        if((!flag)&&(!check(T,V)))            flag=1;    }    if(flag==1)        return 0;    else        return 1;}void ResetT(Tree T)//清除T中各个结点的标记{    if(T->Left)        ResetT(T->Left);    if(T->Right)        ResetT(T->Right);    T->flag=0;}void FreeTree(Tree T)//释放T的空间{    if(T->Left)        FreeTree(T->Left);    if(T->Right)        FreeTree(T->Right);    free(T);}int main(){    int N,L,i;    Tree T;    scanf("%d",&N);    while(N)    {        scanf("%d",&L);        T=MakeTree(N);//建立一棵有n个结点的树        for(i=0;i<L;i++)        {            if(Judge(T,N))                printf("Yes\n");            else                printf("No\n");            ResetT(T);//清除T中的标记        }        FreeTree(T);        scanf("%d",&N);    }    return 0;}

0 0
原创粉丝点击