编写算法判断两棵二叉树T和T’是否相似。两棵二叉树相似是指它们具有相同结构。
时间: 2024-02-18 19:02:11 浏览: 20
可以使用递归算法来判断两棵二叉树是否相似。具体步骤如下:
1. 若二叉树T和T’均为空树,则它们相似,返回true;
2. 若二叉树T和T’中有一个为空树,另一个非空,则它们不相似,返回false;
3. 若二叉树T和T’的根节点的值不相等,则它们不相似,返回false;
4. 递归判断二叉树T的左子树是否与T’的左子树相似,递归判断二叉树T的右子树是否与T’的右子树相似,若都相似,则二叉树T和T’相似,返回true;否则返回false。
下面是示例代码实现:
```
bool isSimilar(TreeNode* T, TreeNode* T') {
if (T == nullptr && T' == nullptr) {
return true;
} else if (T == nullptr || T' == nullptr) {
return false;
} else if (T->val != T'->val) {
return false;
} else {
return isSimilar(T->left, T'->left) && isSimilar(T->right, T'->right);
}
}
```
相关问题
用C语言编写算法判断两棵二叉树T和T’是否相似。两棵二叉树相似是指它们具有相同结构
可以按照以下步骤用C语言编写算法来判断两棵二叉树T和T'是否相似:
1. 定义二叉树结点的结构体,包括结点值、左子树、右子树等成员。
```
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
```
2. 编写递归函数 `isSimilar`,该函数判断两棵二叉树是否相似。若当前结点为空,则返回两棵树是否都为空的结果。若当前结点不为空,则判断两棵树的左右子树是否相似,若都相似,则返回 true,否则返回 false。
```
bool isSimilar(TreeNode* p, TreeNode* q) {
if (!p && !q) { // 两棵树都为空
return true;
}
if (!p || !q) { // 一棵树为空
return false;
}
if (p->val != q->val) { // 结点值不同
return false;
}
bool leftSimilar = isSimilar(p->left, q->left); // 左子树相似
bool rightSimilar = isSimilar(p->right, q->right); // 右子树相似
return leftSimilar && rightSimilar;
}
```
3. 在主函数中调用 `isSimilar` 函数,判断两棵二叉树是否相似。
```
int main() {
// 构造两棵二叉树
TreeNode* T = new TreeNode{1, new TreeNode{2, nullptr, nullptr}, new TreeNode{3, nullptr, nullptr}};
TreeNode* T1 = new TreeNode{1, new TreeNode{2, nullptr, nullptr}, new TreeNode{3, nullptr, nullptr}};
TreeNode* T2 = new TreeNode{1, new TreeNode{2, nullptr, nullptr}, new TreeNode{4, nullptr, nullptr}};
// 判断两棵二叉树是否相似
if (isSimilar(T, T1)) {
printf("T and T1 are similar.\n");
} else {
printf("T and T1 are not similar.\n");
}
if (isSimilar(T, T2)) {
printf("T and T2 are similar.\n");
} else {
printf("T and T2 are not similar.\n");
}
return 0;
}
```
以上是判断两棵二叉树是否相似的C语言算法实现。
C语言判断两棵二叉树是否结构相同
判断两棵二叉树是否结构相同,可以通过递归的方式进行判断。
首先,判断两棵树的根节点是否相同,如果不同则这两棵树的结构肯定不同;如果相同,则递归判断它们的左子树和右子树是否相同。
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点定义
typedef struct node {
int val;
struct node *left;
struct node *right;
} TreeNode;
// 判断两棵二叉树是否结构相同
bool isSameTree(TreeNode* p, TreeNode* q) {
if (p == NULL && q == NULL) {
return true;
} else if (p == NULL || q == NULL) {
return false;
} else if (p->val != q->val) {
return false;
} else {
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
}
// 主函数
int main() {
// 构造两棵二叉树
TreeNode *p1 = (TreeNode *)malloc(sizeof(TreeNode));
TreeNode *p2 = (TreeNode *)malloc(sizeof(TreeNode));
TreeNode *q1 = (TreeNode *)malloc(sizeof(TreeNode));
TreeNode *q2 = (TreeNode *)malloc(sizeof(TreeNode));
TreeNode *q3 = (TreeNode *)malloc(sizeof(TreeNode));
p1->val = 1;
p1->left = p2;
p1->right = NULL;
p2->val = 2;
p2->left = NULL;
p2->right = NULL;
q1->val = 1;
q1->left = q2;
q1->right = q3;
q2->val = 2;
q2->left = NULL;
q2->right = NULL;
q3->val = 3;
q3->left = NULL;
q3->right = NULL;
// 判断两棵二叉树是否结构相同
bool same = isSameTree(p1, q1);
if (same) {
printf("p1 and q1 have the same structure.\n");
} else {
printf("p1 and q1 do not have the same structure.\n");
}
// 释放内存
free(p1);
free(p2);
free(q1);
free(q2);
free(q3);
return 0;
}
```
以上代码中,我们定义了一个 TreeNode 结构体表示二叉树的结点,其中包含了结点的值、左子树和右子树。isSameTree 函数用于判断两棵二叉树是否结构相同,如果相同则返回 true,否则返回 false。在主函数中,我们构造了两棵二叉树,然后调用 isSameTree 函数进行判断。最后,我们释放了动态分配的内存,避免内存泄漏。