以下是C语言版本的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int find_idx(char *inorder, int start, int end, char target) {
for (int i = start; i <= end; i++) {
if (inorder[i] == target) {
return i;
}
}
return -1;
}
TreeNode* buildTree(char* preorder, int preStart, int preEnd, char* inorder, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) {
return NULL;
}
TreeNode *root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = preorder[preStart];
root->left = NULL;
root->right = NULL;
int rootIdx = find_idx(inorder, inStart, inEnd, preorder[preStart]);
int leftLen = rootIdx - inStart;
int rightLen = inEnd - rootIdx;
root->left = buildTree(preorder, preStart + 1, preStart + leftLen, inorder, inStart, rootIdx - 1);
root->right = buildTree(preorder, preEnd - rightLen + 1, preEnd, inorder, rootIdx + 1, inEnd);
return root;
}
void postorder(TreeNode *root) {
if (root == NULL) {
return;
}
postorder(root->left);
postorder(root->right);
printf("%c", root->val);
}
int main() {
char preorder[] = "ABDEGCHF";
char inorder[] = "DBEGAHCF";
int len = sizeof(preorder) / sizeof(preorder[0]);
TreeNode *root = buildTree(preorder, 0, len - 1, inorder, 0, len - 1);
postorder(root);
return 0;
}
```
其中,`buildTree`函数根据先序遍历序列和中序遍历序列构造出二叉树,`postorder`函数实现后序遍历二叉树。