给定一棵二叉树的先序遍历和中序遍历序列,求其后序遍历序列,用c语言编写
时间: 2023-03-19 14:22:32 浏览: 216
以下是用C语言编写的代码,可以根据给定的先序遍历和中序遍历序列求得后序遍历序列:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 定义二叉树结点结构体
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 先序遍历序列和中序遍历序列构建二叉树
TreeNode* buildTree(char* preorder, char* inorder, int preorderStart, int preorderEnd, int inorderStart, int inorderEnd) {
if (preorderStart > preorderEnd || inorderStart > inorderEnd) {
return NULL;
}
// 构建根结点
char rootValue = preorder[preorderStart];
TreeNode* root = (TreeNode*) malloc(sizeof(TreeNode));
root->data = rootValue;
root->left = NULL;
root->right = NULL;
// 在中序遍历序列中找到根结点的位置
int rootPosition = -1;
for (int i = inorderStart; i <= inorderEnd; i++) {
if (inorder[i] == rootValue) {
rootPosition = i;
break;
}
}
// 根据中序遍历序列,划分左右子树,并递归构建左右子树
int leftSize = rootPosition - inorderStart;
root->left = buildTree(preorder, inorder, preorderStart + 1, preorderStart + leftSize, inorderStart, rootPosition - 1);
root->right = buildTree(preorder, inorder, preorderStart + leftSize + 1, preorderEnd, rootPosition + 1, inorderEnd);
return root;
}
// 后序遍历二叉树
void postorderTraversal(TreeNode* root, char* postorder, int* index) {
if (root == NULL) {
return;
}
// 后序遍历左子树
postorderTraversal(root->left, postorder, index);
// 后序遍历右子树
postorderTraversal(root->right, postorder, index);
// 将当前结点的值存入后序遍历序列中
postorder[(*index)++] = root->data;
}
int main() {
char preorder[MAX_SIZE] = "ABDECFG";
char inorder[MAX_SIZE] = "DBEAFCG";
char postorder[MAX_SIZE];
int index = 0;
TreeNode* root = buildTree(preorder, inorder, 0, 6, 0, 6);
postorderTraversal(root, postorder, &index);
printf("后序遍历序列为:%s\n", postorder);
return 0;
}
```
以上代码中,我们先定义了一个二叉树结点结构体,然后编写了一个函数`buildTree`,根据先序遍历和中序遍历序列递归构建二叉树。接下来,我们编写了一个函数`postorderTraversal`,递归后序遍历二叉树,并将遍历结果存入后序遍历序列中。最后,我们在主函数中调
阅读全文