二叉树·判断相同二叉搜索树

根据插入序列{2, 1, 3}和{2, 3, 1}构建的二叉搜索树是相同的。通过中序遍历比较不同插入序列生成的二叉搜索树是否具有相同的结构。" 3567322,35956,从源代码构建Apache Derby:步骤详解,"['数据库', 'Java', '构建工具', 'Apache', 'Derby']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

方法:

为每个序列建树,并利用每棵树的中序遍历判断相同

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct BSTree {
    int data;
    struct BSTree* left;
    struct BSTree* right;
}*BST,BSTree;

BST Insert_Tree(BST root, int key) {
    if (root == NULL) {
        root = (BST)malloc(sizeof(BSTree));
        root -> data = key;
        root -> left = NULL;
        root -> right = NULL;
        return root;
    }
    else {
        if (root -> data > key) {
            root -> left = Insert_Tree(root -> left, key);
        }
        else if (root -> data < key) {
            root -> right = Insert_Tree(root -> right, key);
        }
        return root;
    }
}

int order1[20];
int order2[20];
int num = 0;
int num1 = 0;

void Pre_Tree_Fir(BST root) {
    if (root == NULL) {
        return;
    }

    Pre_Tree_Fir(root -> left);
    Pre_Tree_Fir(root -> right);
    order1[num++] = root -> data;
    return ;
}
void Pre_Tree_Sec(BST root) {
    if (root == NULL) {
        return;
    }
    Pre_Tree_Sec(root -> left);
    Pre_Tree_Sec(root -> right);
    order2[num1++] = root -> data;
    return ;
}

int main() {
    int n, l;
    int i, j, k;
    while(~scanf("%d",&n)){
        if (n == 0) {
            break;
        }
        scanf("%d",&l);
        BST root = NULL, root1 = NULL;
        num = 0;
        num1 = 0;
        for (i = 0; i < n; i++) {
            int a;
            scanf("%d", &a);
            root = Insert_Tree(root, a);

        }
        Pre_Tree_Fir(root);

        while(l --) {
            root1 = NULL;
            num1 = 0;
            for (i = 0; i < n; i++) {
                int a;
                scanf("%d",&a);
                root1 = Insert_Tree(root1, a);
            }
            Pre_Tree_Sec(root1);
            int flag = 1;
            for (i = 0; i <= n; i++) {
                if (order1[i] != order2[i]) {
                    flag = 0;
                    break;
                }
            }
            if (flag) {
                printf("Yes\n");
            }
            else {
                printf("No\n");
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值