c语言实现:设计并验证如下算法:按中序序列建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,输入先序序列(带#号),然后再以中序方式建树
时间: 2023-06-25 09:05:42 浏览: 129
以下是C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 中序遍历建立二叉树
TreeNode* buildTree(char* inorder, int inorderStart, int inorderEnd) {
if (inorderStart > inorderEnd)
return NULL;
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
int mid = (inorderStart + inorderEnd) / 2;
node->val = inorder[mid];
node->left = buildTree(inorder, inorderStart, mid - 1);
node->right = buildTree(inorder, mid + 1, inorderEnd);
return node;
}
// 根据先序序列构造二叉树
TreeNode* constructTree(char* preorder, int* index) {
if (preorder[*index] == '#') {
(*index)++;
return NULL;
}
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = preorder[(*index)++];
node->left = constructTree(preorder, index);
node->right = constructTree(preorder, index);
return node;
}
// 判断两棵二叉树是否相等
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 preorder[100], inorder[100];
printf("请输入先序序列(带#号):");
scanf("%s", preorder);
int n = strlen(preorder), index = 0;
for (int i = 0; i < n; i++) {
if (preorder[i] != '#')
inorder[index++] = preorder[i];
}
TreeNode* root1 = buildTree(inorder, 0, index - 1);
TreeNode* root2 = constructTree(preorder, &index);
if (isSameTree(root1, root2))
printf("两棵二叉树相等\n");
else
printf("两棵二叉树不相等\n");
return 0;
}
```
算法思路:
1. 根据先序序列构造二叉树:对于先序序列中的每个元素,如果是 '#' 表示当前节点为空,否则创建一个新节点,递归构造左右子树。
2. 中序遍历建立二叉树:对于中序序列,取中间元素作为根节点,递归构造左右子树。
3. 判断两棵二叉树是否相等:递归判断两棵二叉树是否相等,如果当前节点值相等并且左右子树均相等,则返回 true,否则返回 false。
注意:
在输入先序序列时,需要将 '#' 过滤掉,因为它并不在中序序列中。
阅读全文