0

我正在尝试解决这个问题-

  • 给定一个无符号 32 位整数数组 A,选择两个界内索引 i、j 以最大化 A[i] ^ A[j] 的值,其中 ^ 是按位 XOR(异或)运算符。

    • 示例输入:

    • 4 2 0 13 49

    • 输出:

    • 60

  • 解释: 13 ^ 49 是 60

这是我的代码

#include <stdio.h>

void insert(int n, int pos, struct node *t);
int find(struct node *p1, struct node *p2);
struct node *alloc();    
struct node{
    int value;
    struct node *left;
    struct node *right;
};
int main()
{

    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n;
        scanf("%d", &n);
        struct node root;
        root.value = 0;
        root.left = root.right = NULL;
        while (n--)
        {
            int num;
            scanf("%d", &num);
            insert(num, 31 , &root);

        }

        int max = find(&root, &root);
        printf("%d\n", max);

    }
    return 0;
}
void insert(int n, int pos, struct node *t)
{
    if (pos >= 0)
    {
        struct node  *m;
        int bit = (1 << pos)&n;
        if (bit)
        {


            if (t->right == NULL)
            {
                m=alloc();
                m->value = 1;
                m->left = NULL;
                m->right = NULL;
                t->right = m;
            }


            if (pos == 0)
            {
                m=alloc();
                m->value = n;
                m->left = NULL;
                m->right = NULL;
                t->left = m;
            }


            insert(n, pos - 1, t->right);
        }
        else
        {


            if (t->left == NULL)
            {
                m = alloc();
                m->value = 0;
                m->left = NULL;
                m->right = NULL;
                t->left = m;
            }


            if (pos == 0)
            {
                m=alloc();
                m->value = n;
                m->left = NULL;
                m->right = NULL;
                t->left = m;
            }

            insert(n, pos - 1, t->left);
        }
    }
}
int find(struct node *p1, struct node *p2)
{


    if ((p1->left != NULL) ||(p1->right != NULL))
    {
        int n01 = 0;
        int n10 = 0;
        if (p1->left != NULL && p2->right != NULL)
        {
            n01 = find(p1->left, p2->right);
        }
        if ((p1->right != NULL) && (p2->left != NULL))
        {
            n10 = find(p2->left, p1->right);
        }
        else
        {
            if (p1->left!=NULL && p2->left!=NULL)
                n01 = find(p1->left, p2->left);
            else
                n10 = find(p1->right, p2->right);
        }
        return (n01 > n10 ? n01 : n10);
    }
    else
    {
        return p1->value^p2->value;
    }
}
struct node *alloc()
{
    return (struct node *) malloc(sizeof(struct node));
}

我只得到一个 0 作为输出。我知道我的代码中有错误。请帮助我找出错误或在必要时找到正确的解决方案。

4

0 回答 0