我正在try 实现一个函数,该函数判断两个二进制搜索树是否相等, node 的顺序无关紧要.但我的实现不起作用.

I am not allowed to flatten the trees into arrays.

这是我到目前为止得到的:

int isIdentical(struct Node* root1, struct Node* root2)
{
    
    if (root1 == NULL && root2 == NULL)
        return 1;
    
    else if (root1 == NULL || root2 == NULL)
        return 0;
    else { 
        if (root1->data == root2->data && isIdentical(root1->left, root2->left)
            && isIdentical(root1->right, root2->right))
            return 1;
        else
            return 0;
    }
}

当提供包含 node tree A = 2 4 5 6Tree B = 2 5 4 6的树时,输出应为:

1,意味着它们相等,但我得到的是0.我不确定我错在哪里.

node 是如何实现的:

struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

推荐答案

制作一个递归函数,遍历treeA并判断treeB中是否存在每个项.失败时,它放弃搜索,失败时返回0.它可以是你的功能

int isIdentical(struct Node* root1, struct Node* root2)

如果成功,请再次调用该函数,并反转treeAtreeB的参数."判断是否存在"操作可以是迭代和内联的,因为它不需要回溯.

示例未经测试的代码,给出了 idea .

int isAllFound(struct Node* root1, struct Node* root2)
{
    // recursive parse of tree 1
    if (root1 == NULL)
        return 1;
    
    // iterative search of tree 2
    int found = 0;
    struct Node *root = root2;
    while(root != NULL) {
        if(root1->data == root->data) {
            found = 1;
            break;
        }
        if(root1->data < root->data)
            root = root->left;
        else
            root = root->right;
    }
    if(!found)
        return 0;
    
    // continue recursive parse of tree 1
    if(!isAllFound(root1->left, root2))
        return 0;
    if(!isAllFound(root1->right, root2))
        return 0;
    return 1;
}

然后像这样打电话

if(isAllFound(treeA, treeB) && isAllFound(treeB, treeA))
    puts("Success!");

如果treeA的每个项目都可以在treeB中找到,并且treeB的每个项目都可以在treeA中找到,那么它们包含相同的数据.只要 keys 是唯一的.

C++相关问答推荐

在Windows上构建无聊的SSL x64

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

编译的时候g++通常会比GCC慢很多吗?

fwrite无法写入满(非常大)缓冲区

以下声明和定义之间的区别

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

C中函数类型的前向声明

使用错误的命令执行程序

不同出处的指针可以相等吗?

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

STM32 FATFS用户手册(Um1721)中的代码正确吗?

用C++初始化局部数组变量

分配给静态变量和动态变量的位置之间有区别吗?

为什么一个在线编译器拒绝这个VLA代码,而本地的Apple clang却不拒绝;t?

在我的函数中实现va_arg的问题

如何使用 VLA 语法使用 const 指针声明函数

通过修改c中的合并排序对数组的偶数索引进行排序

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

文件指针引起的C程序分段错误

计算 e^x 很好.但不是 x 的罪