1.用C语言利用递归方式实现二叉树中序遍历与后序遍历(利用先序遍历方法建树)。 测试用例---输入字符串:A B D # # # C # # ;输出字符串:DBAC; DBCA,写出代码
时间: 2024-10-25 19:11:40 浏览: 19
PHP基于非递归算法实现先序、中序及后序遍历二叉树操作示例
在C语言中,我们可以使用递归的方式实现二叉树的中序遍历和后序遍历。首先,我们需要定义一个二叉树节点结构体,并假设给定的输入字符串表示了从根节点开始的先序遍历序列(例如 A-B-D-C)。这里,'#' 代表空节点。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建新节点
TreeNode* createNode(char value) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = value;
newNode->left = newNode->right = NULL;
return newNode;
}
// 根据先序遍历创建二叉树
TreeNode* buildTree(char str[], int start, int end) {
if (start > end)
return NULL;
char rootValue = str[start];
TreeNode* root = createNode(rootValue);
int i;
for (i = start + 1; i <= end && str[i] != '#'; ++i) {
TreeNode* current = root;
while (str[i] != ' ' && current->left == NULL) {
current->left = createNode(str[i]);
i++;
}
if (current->left != NULL)
current = current->left;
else {
current->right = createNode(str[i]);
i++;
}
}
return root;
}
// 中序遍历(递归)
void inorderTraversal(TreeNode* node, char* result, int index) {
if (node == NULL)
return;
inorderTraversal(node->left, result, index);
result[index++] = node->data;
inorderTraversal(node->right, result, index);
}
// 后序遍历(递归)
void postorderTraversal(TreeNode* node, char* result, int index) {
if (node == NULL)
return;
postorderTraversal(node->left, result, index);
postorderTraversal(node->right, result, index);
result[index++] = node->data;
}
int main() {
char input[] = "A B D # # # C # #";
char output[50];
int inputLength = strlen(input);
// 先序遍历构建二叉树
TreeNode* root = buildTree(input, 0, inputLength - 1);
// 中序遍历并打印结果
inorderTraversal(root, output, 0);
printf("中序遍历结果: ");
for (int i = 0; i < inputLength - 1; ++i)
printf("%c", output[i]);
printf("; ");
// 后序遍历并打印结果
postorderTraversal(root, output, 0);
printf("后序遍历结果: ");
for (int i = 0; i < inputLength - 1; ++i)
printf("%c", output[i]);
printf("\n");
return 0;
}
```
当你运行这个程序,给定的输入 "A B D # # # C # #" 将分别得到中序遍历 "DBAC" 和后序遍历 "DBC". 注意,在后序遍历的结果中,字符的顺序可能与给定的输入略有不同,因为后序遍历的顺序通常是左、右、根。
阅读全文