浙大数据结构 — 第四讲 — 判断是否同一颗搜索树(c语言)

题意理解:

先建一颗树,根据给定序列按顺序搜索序列中的每个数。
如果每次搜索所经过的节点在之前的搜索中均出现过,则一致。
否则,(某一次搜索的结点之前一个结点在之前没出现过)则不一致。

输入样例:

4 2 (表示树有四个结点,有两个比较序列)
3 1 4 2
3 4 1 2
3 2 4 1
2 1 (两个结点,一个比较序列)
2 1
1 2
0

代码如下:
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode *Tree;
struct TreeNode{
    int v;
    Tree left, right;
    int flag;       //某节点被访问过则设为1;否则设为0
};

Tree MakeTree(int N);
Tree NewNode(int V);
Tree Insert(Tree T, int V);
int check(Tree T, int V);
int Judge(Tree T, int  N);
void ResetT(Tree T);        //清除T中各节点的lag标记
void FreeTree(Tree T);      //释放T的空间

int main()
{
    int N, L, i;
    Tree T;

    scanf("%d", &N);        //how many tree node
    while(N){
        scanf("%d",&L);     //how many comparison sequence
        T = MakeTree(N);    //use numnbr N to make a new tree
        for(i=0; i<L; i++){
            if(Judge(T,N))
                printf("yes\n");
            else
                printf("no\n");
            ResetT(T);      //clear T flag
        }
        FreeTree(T);
        scanf("%d",&N);
    }
    return 0;
}

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;
}

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)
        T = NewNode(V);
    else{
        if(V>T->v)
            T->right = Insert(T->right, V);
        else
            T->left = Insert(T->left,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, fflag=0;      //fflag:0代表目前还一致,1代表已经不一致

    scanf("%d",&V);
    if(V != T->v)
        fflag = 1;
    else
        T->flag = 1;

    for(i = 1; i<N; i++){
        scanf("%d",&V);
        if((!fflag)&&(!check(T,V)))
            fflag = 1;
    }
    if(fflag)   return 0;
    else    return 1;
}

void ResetT(Tree T)
{
    if(T->left) ResetT(T->left);
    if(T->right)    ResetT(T->right);
    T->flag = 0;
}

void FreeTree(Tree T)
{
    if(T->left) FreeTree(T->left);
    if(T->right)    FreeTree(T->right);
    free(T);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值