在c语言中,按先序遍历序列建立两个二叉树的二叉链表 A 和链表 B ,设计算法判断 A 、 B 二叉树是否相似。输入由用户决定
时间: 2023-07-15 08:11:03 浏览: 147
实现该算法的主要思路是:对于两个二叉树 A 和 B,若它们相似,则它们的根节点一定相同,且它们的左子树和右子树也分别相似。因此,我们可以通过递归的方式,对比 A 和 B 的根节点、左子树和右子树是否相似,来判断它们是否相似。
具体实现步骤如下:
1. 定义二叉树的结构体:
```c
typedef struct BiTNode {
char data; // 节点数据
struct BiTNode *lchild; // 左子树指针
struct BiTNode *rchild; // 右子树指针
} BiTNode, *BiTree;
```
2. 实现一个函数,按照先序遍历序列建立二叉树:
```c
// 按先序遍历序列建立二叉树
void createBiTree(BiTree *T) {
char ch;
scanf("%c", &ch);
if (ch == '#') {
*T = NULL;
} else {
*T = (BiTNode*)malloc(sizeof(BiTNode));
(*T)->data = ch;
createBiTree(&((*T)->lchild)); // 递归建立左子树
createBiTree(&((*T)->rchild)); // 递归建立右子树
}
}
```
3. 实现一个函数,判断两个二叉树是否相似:
```c
// 判断两个二叉树是否相似
int isSimilar(BiTree A, BiTree B) {
if (A == NULL && B == NULL) { // 都为空,相似
return 1;
}
if (A == NULL || B == NULL) { // 其中一个为空,不相似
return 0;
}
if (A->data != B->data) { // 根节点数据不相同,不相似
return 0;
}
int leftSimilar = isSimilar(A->lchild, B->lchild); // 递归判断左子树是否相似
int rightSimilar = isSimilar(A->rchild, B->rchild); // 递归判断右子树是否相似
return leftSimilar && rightSimilar; // 左右子树都相似,才相似
}
```
4. 在主函数中,按照先序遍历序列分别建立两个二叉树 A 和 B,然后调用 isSimilar 函数判断它们是否相似:
```c
int main() {
BiTree A, B;
printf("请输入二叉树 A 的先序遍历序列:\n");
createBiTree(&A);
getchar(); // 消耗输入缓冲区中多余的回车符
printf("请输入二叉树 B 的先序遍历序列:\n");
createBiTree(&B);
int result = isSimilar(A, B);
if (result) {
printf("A 和 B 二叉树相似!\n");
} else {
printf("A 和 B 二叉树不相似!\n");
}
return 0;
}
```
注意:该算法的时间复杂度为 O(n),其中 n 表示二叉树中节点的个数。
阅读全文