1.C语言编程实现根据二叉树的先序遍历序列和中序遍历序列来建立两棵二叉树,并判断这两棵二叉树是否相等。
时间: 2023-11-23 18:06:03 浏览: 73
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点
typedef struct TreeNode {
char val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 递归建立二叉树
TreeNode* buildTree(char* preorder, int preStart, int preEnd, char* inorder, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) {
return NULL;
}
// 先序遍历序列第一个元素为根结点
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = preorder[preStart];
// 在中序遍历序列中查找根结点
int rootIndex = inStart;
while (inorder[rootIndex] != root->val) {
rootIndex++;
}
// 递归建立左右子树
root->left = buildTree(preorder, preStart + 1, preStart + rootIndex - inStart, inorder, inStart, rootIndex - 1);
root->right = buildTree(preorder, preStart + rootIndex - inStart + 1, preEnd, inorder, rootIndex + 1, inEnd);
return root;
}
// 判断两棵二叉树是否相等
int isSameTree(TreeNode* p, TreeNode* q) {
if (p == NULL && q == NULL) {
return 1;
}
if (p == NULL || q == NULL) {
return 0;
}
if (p->val != q->val) {
return 0;
}
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
int main() {
char preorder1[] = {'A', 'B', 'D', 'E', 'C', 'F', 'G'};
char inorder1[] = {'D', 'B', 'E', 'A', 'F', 'C', 'G'};
char preorder2[] = {'A', 'B', 'D', 'E', 'C', 'F', 'G'};
char inorder2[] = {'D', 'B', 'E', 'A', 'F', 'C', 'G'};
TreeNode* tree1 = buildTree(preorder1, 0, 6, inorder1, 0, 6);
TreeNode* tree2 = buildTree(preorder2, 0, 6, inorder2, 0, 6);
if (isSameTree(tree1, tree2)) {
printf("两棵二叉树相等\n");
} else {
printf("两棵二叉树不相等\n");
}
return 0;
}
```
输出结果为:
```
两棵二叉树相等
```
其中,`buildTree` 函数用于递归建立二叉树,参数说明如下:
- `preorder`:先序遍历序列数组;
- `preStart`:先序遍历序列起始位置;
- `preEnd`:先序遍历序列结束位置;
- `inorder`:中序遍历序列数组;
- `inStart`:中序遍历序列起始位置;
- `inEnd`:中序遍历序列结束位置。
`isSameTree` 函数用于判断两棵二叉树是否相等,参数说明如下:
- `p`:第一棵二叉树的根结点;
- `q`:第二棵二叉树的根结点。
阅读全文