应用二叉树的遍历操作来实现判断两棵二叉树是否相等的操作
时间: 2023-10-09 14:11:15 浏览: 112
我们可以使用二叉树的先序遍历来实现判断两棵二叉树是否相等的操作。具体的实现过程如下:
1. 如果两棵二叉树都为空,则它们相等;
2. 如果两棵二叉树中有一棵为空,则它们不相等;
3. 如果两棵二叉树的根节点值不相等,则它们不相等;
4. 如果两棵二叉树的根节点值相等,则递归比较它们的左子树和右子树是否相等。
具体的实现代码如下所示:
```
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == nullptr && q == nullptr) {
return true;
} else if (p == nullptr || q == nullptr) {
return false;
} else if (p->val != q->val) {
return false;
} else {
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
}
```
其中,`TreeNode` 是二叉树的节点定义,`p` 和 `q` 分别表示两棵二叉树的根节点。
相关问题
C语言应用二叉树的遍历操作来实现判断两棵二叉树是否相等的操作
判断两棵二叉树是否相等,需要对这两棵二叉树进行遍历操作,比较它们的各个节点的值是否相等。
具体实现可以按照以下步骤:
1. 定义二叉树节点结构体,包括节点值和左右子节点指针。
```
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
```
2. 实现二叉树的遍历函数,这里以前序遍历为例。
```
void preorderTraversal(struct TreeNode* root, int* arr, int* size) {
if (root == NULL) {
arr[(*size)++] = -1; // 用-1表示空节点
return;
}
arr[(*size)++] = root->val;
preorderTraversal(root->left, arr, size);
preorderTraversal(root->right, arr, size);
}
```
3. 实现判断两棵二叉树是否相等的函数。
```
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
int arr1[1000], arr2[1000], size1 = 0, size2 = 0;
preorderTraversal(p, arr1, &size1); // 遍历第一棵二叉树
preorderTraversal(q, arr2, &size2); // 遍历第二棵二叉树
if (size1 != size2) return false; // 如果节点个数不相等,直接返回false
for (int i = 0; i < size1; i++) {
if (arr1[i] != arr2[i]) return false; // 如果对应节点的值不相等,直接返回false
}
return true;
}
```
这样,就可以用C语言应用二叉树的遍历操作来实现判断两棵二叉树是否相等的操作了。
应用二叉树的遍历操作来实现判断两棵二叉树是否相等的操作 C语言
判断两棵二叉树是否相等,可以通过比较它们的前序遍历、中序遍历或后序遍历结果来实现。这里以前序遍历为例,具体实现如下:
```c
#include <stdio.h>
#include <stdbool.h>
// 定义二叉树结点结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 前序遍历二叉树,将遍历结果存储在数组中
void preOrder(TreeNode* root, int arr[], int* len) {
if (root == NULL) {
return;
}
arr[(*len)++] = root->val;
preOrder(root->left, arr, len);
preOrder(root->right, arr, len);
}
// 判断两个数组是否相等
bool isEqual(int arr1[], int len1, int arr2[], int len2) {
if (len1 != len2) {
return false;
}
for (int i = 0; i < len1; i++) {
if (arr1[i] != arr2[i]) {
return false;
}
}
return true;
}
// 判断两棵二叉树是否相等
bool isSameTree(TreeNode* p, TreeNode* q) {
int arr1[100], arr2[100];
int len1 = 0, len2 = 0;
preOrder(p, arr1, &len1); // 对第一棵二叉树进行前序遍历
preOrder(q, arr2, &len2); // 对第二棵二叉树进行前序遍历
return isEqual(arr1, len1, arr2, len2); // 比较两个数组是否相等
}
int main() {
// 创建两棵二叉树
TreeNode* p = (TreeNode*)malloc(sizeof(TreeNode));
p->val = 1;
p->left = (TreeNode*)malloc(sizeof(TreeNode));
p->left->val = 2;
p->left->left = NULL;
p->left->right = NULL;
p->right = (TreeNode*)malloc(sizeof(TreeNode));
p->right->val = 3;
p->right->left = NULL;
p->right->right = NULL;
TreeNode* q = (TreeNode*)malloc(sizeof(TreeNode));
q->val = 1;
q->left = (TreeNode*)malloc(sizeof(TreeNode));
q->left->val = 2;
q->left->left = NULL;
q->left->right = NULL;
q->right = (TreeNode*)malloc(sizeof(TreeNode));
q->right->val = 3;
q->right->left = NULL;
q->right->right = NULL;
// 判断两棵二叉树是否相等
bool same = isSameTree(p, q);
if (same) {
printf("Two binary trees are the same!\n");
} else {
printf("Two binary trees are different!\n");
}
return 0;
}
```
运行结果如下:
```
Two binary trees are the same!
```
阅读全文