前面代码是处理 Huffman 编码的,与判断二叉树同构无关。

下面是修改后的代码,用于判断两棵二叉树是否同构:

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

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

// 创建二叉树节点
Node* createNode(int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 判断两棵二叉树是否同构
int isIsomorphic(Node* t1, Node* t2) {
    // 如果两棵树都为空,认为它们是同构的
    if (t1 == NULL && t2 == NULL) {
        return 1;
    }
    // 如果只有一棵树为空,认为它们不是同构的
    if (t1 == NULL || t2 == NULL) {
        return 0;
    }
    // 如果根节点的值不相等,认为它们不是同构的
    if (t1->data != t2->data) {
        return 0;
    }
    // 递归判断左子树和右子树是否同构(同构的两棵二叉树的左子树和右子树可以互换)
    return (isIsomorphic(t1->left, t2->left) && isIsomorphic(t1->right, t2->right)) ||
           (isIsomorphic(t1->left, t2->right) && isIsomorphic(t1->right, t2->left));
}

int main() {
    int n;
    scanf('%d', &n);

    Node** t1 = (Node**)malloc(n * sizeof(Node*));
    Node** t2 = (Node**)malloc(n * sizeof(Node*));

    int i;
    for (i = 0; i < n; i++) {
        t1[i] = createNode(0);
        t2[i] = createNode(0);
    }

    // 读取第一棵树的节点信息
    for (i = 0; i < n; i++) {
        int val, leftval, rightval;
        scanf('%d %d %d', &val, &leftval, &rightval);
        t1[i]->data = val;
        if (leftval != -1) {
            t1[i]->left = t1[leftval];
        }
        if (rightval != -1) {
            t1[i]->right = t1[rightval];
        }
    }

    // 读取第二棵树的节点信息
    for (i = 0; i < n; i++) {
        int val, leftval, rightval;
        scanf('%d %d %d', &val, &leftval, &rightval);
        t2[i]->data = val;
        if (leftval != -1) {
            t2[i]->left = t2[leftval];
        }
        if (rightval != -1) {
            t2[i]->right = t2[rightval];
        }
    }

    // 判断两棵二叉树是否同构
    int result = isIsomorphic(t1[0], t2[0]);
    if (result) {
        printf('yes\n');
    } else {
        printf('no\n');
    }

    // 释放内存
    for (i = 0; i < n; i++) {
        free(t1[i]);
        free(t2[i]);
    }
    free(t1);
    free(t2);

    return 0;
}

此代码中,我们定义了一个Node结构体来表示二叉树节点。我们通过createNode函数创建节点,并用数组t1t2来保存第一棵树和第二棵树的节点。

然后,我们使用scanf函数读取每个节点的值以及左右子节点的索引,然后将它们连接起来。

最后,我们调用isIsomorphic函数来判断两棵二叉树是否同构,并根据结果打印出相应的输出。

希望这次能够正确解决问题,如果还有其他问题,请随时提问。

判断两棵二叉树是否同构的 C 代码示例

原文地址: https://www.cveoy.top/t/topic/07H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录