是否同一颗二叉搜索树

关于BST的重要例题
测试数据
输入
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出
Yes
No
No

#include<stdio.h>
#include<stdlib.h>
// 给你两个序列是否对应相同搜索树的判别
//建一颗树,然后其他序列和他去做比较
typedef struct TreeNode* Tree;
struct TreeNode{
    int v;
    Tree Left,Right;
    int flag;//用来判别是不是一致的   如果没被访问过设为0  被访问变为1
};

//new 一个结点赋好初值
Tree NewNode(int V)
{
    Tree T = (Tree) malloc(sizeof(struct TreeNode));
    T->v = V;
    T->Left=T->Right=NULL;
    T->flag=0;
    return T;
}
//二叉搜索树  插入--基本操作
Tree Insert(Tree T,int V)
{
    if(T==NULL)
        T = NewNode(V);
    else{
        if(V>T->v)
            T->Right = Insert(T->Right,V);
        else
            T->Left = Insert(T->Left,V);
    }
    return T;
}
//如何判别序列是否与树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{ //碰到了一个以前没碰到过的结点  如果是要找的,return 1
        //如果不是的话 return 0
        if(V == T->v)
        {
            T->flag =1;
            return 1;
        }
        else  
            return 0;
    }
}
int Judge(Tree T, int N)
{
    int i,V,flag=0;
        /*flag: 0 表示目前还一致,1表示已经不一致了*/
    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)
        return 0;
    else
        return 1;

    return 1;
}
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;
}
void ResetT(Tree 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()
{
/*
对每组数据
    读入n和l
    根据第一行序列建树
    依据树t分别判别后面的l个序列是否能与T形成同一搜索树并输出结果
*/
    int N,L,i;
    Tree T;
    scanf("%d",&N);
    while(N)
    {
        scanf("%d",&L);
        T = MakeTree(N);//建树   读入一组数据并建树
        for(i=0;i<L;i++)
        {
            if(Judge(T,N))//Judge读入后面的n个数,与T去比较
                printf("YES\n");
            else
                printf("NO\n");
            ResetT(T);//清除标记flag
        }
        FreeTree(T);
        scanf("%d",&N);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36734025/article/details/80695300