给定一棵二叉树的后序序列和中序序列,求它的前序序列。输入多组数据,每组数据为一行,包含两个字符串,中间用空格隔开,分别表示二叉树的后序序列和中序序列。每组数据输出一行,每一行代表对应的二叉树的先序序列。用c语言实现代码。
时间: 2024-05-04 08:17:47 浏览: 102
唯一地确定一棵二叉树
以下是C语言实现代码:
```c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_SIZE 1000
typedef struct TreeNode {
char val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
int findIndex(char* str, int start, int end, char target) {
for (int i = start; i <= end; i++) {
if (str[i] == target) {
return i;
}
}
return -1;
}
TreeNode* buildTree(char* inorder, char* postorder, int inStart, int inEnd, int postStart, int postEnd) {
if (inStart > inEnd || postStart > postEnd) {
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = postorder[postEnd];
int index = findIndex(inorder, inStart, inEnd, postorder[postEnd]);
root->left = buildTree(inorder, postorder, inStart, index - 1, postStart, postStart + index - inStart - 1);
root->right = buildTree(inorder, postorder, index + 1, inEnd, postStart + index - inStart, postEnd - 1);
return root;
}
void preorder(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%c ", root->val);
preorder(root->left);
preorder(root->right);
}
int main() {
char inorder[MAX_SIZE], postorder[MAX_SIZE];
while (scanf("%s %s", postorder, inorder) != EOF) {
int len = strlen(inorder);
TreeNode* root = buildTree(inorder, postorder, 0, len - 1, 0, len - 1);
preorder(root);
printf("\n");
}
return 0;
}
```
算法思路:
根据后序遍历序列的特点,可以得到后序遍历序列的最后一个元素为根节点。然后在中序遍历序列中找到根节点的位置,通过根节点的位置将中序遍历序列分成左子树和右子树。在后序遍历序列中,根节点的左边为左子树的后序遍历序列,右边为右子树的后序遍历序列。通过递归的方式,可以重建出整棵二叉树。最后再通过前序遍历的方式输出结果。
时间复杂度:$O(nlogn)$
空间复杂度:$O(n)$
其中,n为二叉树中的节点数。
阅读全文