判断两棵二叉树是否同构的 C 代码示例
前面代码是处理 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函数创建节点,并用数组t1和t2来保存第一棵树和第二棵树的节点。
然后,我们使用scanf函数读取每个节点的值以及左右子节点的索引,然后将它们连接起来。
最后,我们调用isIsomorphic函数来判断两棵二叉树是否同构,并根据结果打印出相应的输出。
希望这次能够正确解决问题,如果还有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/07H 著作权归作者所有。请勿转载和采集!