编写一个C语言程序,实现1选择某种存储结构,建立一棵二叉树,并实现二叉树的4种遍历算法(先序、 40 中序、后序、层序)。 2输入两个字符串,其长度均小于26。第一行为前序遍历,第二行为中序遍历。 二叉树的结点名称以大写字母表示:A,B,C,D.......,最多26个字母。输出后 续遍历的字符串。 3根据前序遍历字符串和中序遍历字符串递归构造每个节点及该节点的数据域、 左子树指针和右子树指针。如第一遍遍历,前序遍历字符串的第一个字母为根, 然后在中序遍历字符串中查找根字母,并记录偏移数,根字母左侧的都是左子 树的节点,根的右侧都是右子树的节点。根据偏移数递归构造左子树和右子树。 4输出度为1的节点。
时间: 2024-04-12 15:31:25 浏览: 89
以下是满足您要求的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char data;
struct Node* left;
struct Node* right;
} Node;
// 创建节点
Node* createNode(char data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 构建二叉树
Node* buildTree(char preorder[], char inorder[], int start, int end) {
static int preIndex = 0;
// 边界情况
if (start > end) {
return NULL;
}
// 创建当前节点
Node* newNode = createNode(preorder[preIndex++]);
// 如果当前区间只有一个元素,返回该节点
if (start == end) {
return newNode;
}
// 在中序遍历中找到当前节点的位置
int inIndex;
for (int i = start; i <= end; i++) {
if (inorder[i] == newNode->data) {
inIndex = i;
break;
}
}
// 递归构建左子树和右子树
newNode->left = buildTree(preorder, inorder, start, inIndex - 1);
newNode->right = buildTree(preorder, inorder, inIndex + 1, end);
return newNode;
}
// 先序遍历
void preorderTraversal(Node* root) {
if (root != NULL) {
printf("%c ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
// 中序遍历
void inorderTraversal(Node* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%c ", root->data);
inorderTraversal(root->right);
}
}
// 后序遍历
void postorderTraversal(Node* root) {
if (root != NULL) {
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%c ", root->data);
}
}
// 层序遍历
void levelOrderTraversal(Node* root) {
if (root == NULL) {
return;
}
Node* queue[100];
int front = -1, rear = -1;
queue[++rear] = root;
while (front != rear) {
Node* temp = queue[++front];
printf("%c ", temp->data);
if (temp->left != NULL) {
queue[++rear] = temp->left;
}
if (temp->right != NULL) {
queue[++rear] = temp->right;
}
}
}
// 输出度为1的节点
void printNodesWithDegree1(Node* root) {
if (root == NULL) {
return;
}
if ((root->left == NULL && root->right != NULL) || (root->left != NULL && root->right == NULL)) {
printf("%c ", root->data);
}
printNodesWithDegree1(root->left);
printNodesWithDegree1(root->right);
}
int main() {
char preorder[26], inorder[26];
printf("请输入前序遍历字符串:");
scanf("%s", preorder);
printf("请输入中序遍历字符串:");
scanf("%s", inorder);
int size = strlen(preorder);
Node* root = buildTree(preorder, inorder, 0, size - 1);
printf("后序遍历结果:");
postorderTraversal(root);
printf("\n");
printf("度为1的节点:");
printNodesWithDegree1(root);
printf("\n");
return 0;
}
```
希望这个程序能满足您的需求!
阅读全文