知一个二叉树的前序遍历序列和中序遍历序列,求其后序遍历序列。用c语言来写
时间: 2024-03-13 13:17:08 浏览: 80
c代码-用前序序列和中序序列构建链表二叉树,并且按照层次遍历
以下是用C语言实现根据前序和中序遍历结果求后序遍历结果的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
};
struct TreeNode* buildTree(char* pre, char* in, int len) {
if (len == 0) {
return NULL;
}
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val = *pre;
int rootIndex = 0;
while (in[rootIndex] != *pre) {
rootIndex++;
}
root->left = buildTree(pre + 1, in, rootIndex);
root->right = buildTree(pre + rootIndex + 1, in + rootIndex + 1, len - rootIndex - 1);
return root;
}
void postorderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%c ", root->val);
}
int main() {
char preOrder[] = {'A', 'B', 'D', 'E', 'C', 'F', 'G'};
char inOrder[] = {'D', 'B', 'E', 'A', 'F', 'C', 'G'};
int len = strlen(preOrder);
struct TreeNode* root = buildTree(preOrder, inOrder, len);
printf("The post-order traversal sequence is: ");
postorderTraversal(root);
printf("\n");
return 0;
}
```
上述代码中,我们首先定义了一个树的结构体 `TreeNode`,然后实现了一个 `buildTree` 函数用来根据前序遍历和中序遍历的结果建立二叉树。具体地,我们首先根据前序遍历的结果确定当前子树的根节点,然后在中序遍历的结果中找到根节点的位置,进而确定左子树和右子树的前序遍历和中序遍历结果。最后递归地建立整个二叉树。注意到这里我们使用了指针而不是数组来传递参数,这样可以避免大量的内存拷贝操作。
另外,我们还实现了一个 `postorderTraversal` 函数用来对建立好的二叉树进行后序遍历,并输出遍历结果。
最后,在 `main` 函数中我们定义了前序遍历和中序遍历的结果,调用 `buildTree` 函数建立二叉树,再调用 `postorderTraversal` 函数输出后序遍历的结果。
阅读全文