A - 数据结构实验之查找一:二叉排序树

Description
对应给定的一个序列可以唯一确定一棵二叉排序树。然而,一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树,都得到一样的结果。你的任务书对于输入的各种序列,判断它们是否能生成一样的二叉排序树。

Input
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (n < = 10)和L,分别是输入序列的元素个数和需要比较的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列生成一颗二叉排序树。随后L行,每行给出N个元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

Output
对每一组需要检查的序列,如果其生成的二叉排序树跟初始序列生成的二叉排序树一样,则输出"Yes",否则输出"No"。

Sample
Input
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
Output
Yes
No
No

#include <stdio.h>
#include <stdlib.h>
typedef struct BiTree {
    int data;
    struct BiTree *l, *r;
} Tree;

//Binary Sort Tree二叉排序树
//利用插入法构建二叉排序树
Tree *CreatBST(Tree *root, int key) {
    if(!root) {//当前节点为空(叶子节点)
        //相当于遍历二叉树,当找到叶子节点时证明找到了当前key应该插入的位置
        root = (Tree*)malloc(sizeof(Tree));
        root->data = key;
        root->r = NULL;
        root->l = NULL;
    } else {//当前节点不为空则继续遍历(没找到叶子节点)
        if(key > root->data) {
            root->r = CreatBST(root->r, key);
        } else {
            root->l = CreatBST(root->l, key);
        }
    }
    return root;
}

int flag;
void judge(Tree *root1, Tree *root2) {
    //如果有一个是空,一个不是空,则直接判断为构成的二叉排序树不一样
    if((!root1 && root2) || (root1 && !root2)) {
        flag = 0;
        return ;
    }
    //若两个都不为空
    if(root1 && root2) {
        //顶点不相等则判断为不一样,直接结束
        if(root1->data != root2->data) {
            flag = 0;
            return;
        }
        //左右子树继续比较
        judge(root1->l, root2->l);
        judge(root2->r, root2->r);
    }
}
int main() {
    int n;//序列元素个数
    int l;//需要比较的序列个数
    Tree *root1;//初始序列
    Tree *root2;//待比较序列
    int key;
    while(scanf("%d", &n) && n != 0) {
        root1 = NULL;
        root2 = NULL;
        flag = 1;
        scanf("%d", &l);
        for(int i = 0; i < n; i++) {
            scanf("%d", &key);
            root1 = CreatBST(root1, key);
        }
        while(l--) {
            for(int i = 0; i < n; i++) {
                scanf("%d", &key);
                root2 = CreatBST(root2, key);
            }
            judge(root1, root2);
            if(flag == 0) {
                printf("No\n");
            } else {
                printf("Yes\n");
            }
        }
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心醉瑶瑾前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值