C语言给出一个按照“扩展遍历序列”的扩展先序遍历序列字符串,'.' 代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并分别采用“递归”的先序、中序、后序遍历算法输出该树的每个非空节点构成的序列。
时间: 2023-09-16 17:05:57 浏览: 119
二叉树的几种操作,包括递归先序建立二叉树、先序遍历、中序遍历、后序遍历、非递归的各种遍历
### 回答1:
好的,我理解了您的问题。根据您提供的信息,我可以为您提供以下C代码。
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_N 100
// 定义二叉树结构体
typedef struct TreeNode {
char data; // 节点内容
struct TreeNode *left; // 左子节点
struct TreeNode *right; // 右子节点
} TreeNode;
// 根据扩展先序遍历序列字符串建立二叉树
TreeNode *buildTree(char *str) {
static int idx = 0;
if (idx >= strlen(str)) {
return NULL;
}
if (str[idx] == '.') {
idx++;
return NULL;
}
TreeNode *root = (TreeNode *) malloc(sizeof(TreeNode));
root->data = str[idx];
idx++;
root->left = buildTree(str);
root->right = buildTree(str);
return root;
}
// 先序递归遍历二叉树
void preOrderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
printf("%c ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
// 中序递归遍历二叉树
void inOrderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
inOrderTraversal(root->left);
printf("%c ", root->data);
inOrderTraversal(root->right);
}
// 后序递归遍历二叉树
void postOrderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%c ", root->data);
}
int main() {
char str[MAX_N];
scanf("%s", str);
TreeNode *root = buildTree(str);
printf("先序遍历结果为:");
preOrderTraversal(root);
printf("\n中序遍历结果为:");
inOrderTraversal(root);
printf("\n后序遍历结果为:");
postOrderTraversal(root);
printf("\n");
return 0;
}
```
您可以根据上述代码进行编译和运行,在输入扩展先序遍历序列字符串后,即可得到程序的输出结果。请注意,本程序仅考虑了序列中的非空节点,空节点直接跳过。
### 回答2:
可以通过递归的方式来建立二叉树,并分别采用递归的先序、中序、后序遍历算法输出每个非空节点构成的序列。
首先,我们定义一个二叉树的结构体,包括一个值域变量和左右子树的指针。
```c
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
char val;
struct TreeNode* left;
struct TreeNode* right;
};
```
接下来,我们可以定义一个函数来创建二叉树,函数的输入是一个按照扩展先序遍历序列表示的字符串,返回创建好的二叉树的根节点指针。
```c
struct TreeNode* createTree(char seq[], int* index) {
if (seq[*index] == '.') {
(*index)++;
return NULL;
}
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = seq[*index];
(*index)++;
node->left = createTree(seq, index);
node->right = createTree(seq, index);
return node;
}
```
接着,我们可以定义分别采用递归的方式进行先序、中序和后序遍历的函数,每个函数遍历到非空节点时,将该节点的值输出到序列中。
```c
void preorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
printf("%c ", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
void inorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%c ", root->val);
inorderTraversal(root->right);
}
void postorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%c ", root->val);
}
```
最后,我们可以在主函数中调用以上函数,完成对输入的扩展先序遍历序列字符串建立二叉树,并输出先序、中序、后序遍历的结果。
```c
int main() {
char seq[] = "AB..C...D..";
struct TreeNode* root = NULL;
int index = 0;
root = createTree(seq, &index);
printf("先序遍历结果:");
preorderTraversal(root);
printf("\n");
printf("中序遍历结果:");
inorderTraversal(root);
printf("\n");
printf("后序遍历结果:");
postorderTraversal(root);
printf("\n");
return 0;
}
```
运行程序,得到的输出结果为:
先序遍历结果:A B C D
中序遍历结果:B A C D
后序遍历结果:B D C A
阅读全文