转载自:
http://blog.youkuaiyun.com/sunmeng_007/article/details/8095224
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
//定义节点
typedef struct btnode
{
char value;
struct btnode *left;
struct btnode *right;
}btnode;
//该函数的作用是:返回在中序遍历序列数组中根节点的下标
//函数的第一个参数是前序遍历序列数组
//函数的第二个参数是中序遍历序列数组
//函数的第三个参数是前序遍历序列与中序遍历序列的长度
int get_root_idx(char *preorder, char *inorder, int n)
{
int i;
char ch;
//该循环的初始化操作包括了把ch赋值为preorder[]数组的首个元素
//因为preorder[]的首个元素是根节点
for(i=0, ch=preorder[0]; i<n; i++)
if(inorder[i]==ch)
return i;
return -1;
}
//根据先序遍历序列和中序遍历序列建立二叉树链表
//btnode *build_from_preorder_and_inorder(前序遍历数组,中序遍历数组, 数组长度)
btnode *build_from_preorder_and_inorder(char *preorder, char *inorder, int n)
{
//如果表长为0,return NULL
if(n==0)
return NULL;
//根节点的值即为前序遍历数组的第一个元素
int root_val = preorder[0];
//找到中序遍历序列数组中根节点的下标
int i = get_root_idx(preorder, inorder, n);
//为二叉树链表建立根节点
btnode *root = (btnode*)malloc(sizeof(btnode));
//为根节点赋值
root->value = root_val;
//构造根节点的左子树
root->left = build_from_preorder_and_inorder(preorder+1, inorder, i);
//构造根节点的右子树
root->right = build_from_preorder_and_inorder(preorder+i+1, inorder+i+1, n-i-1);
//返回根节点
return root;
}
//后续遍历打印二叉树链表
void postorder(btnode *root)
{
if(root)
{
postorder(root->left);
postorder(root->right);
printf("%c", root->value);
}
}
int main()
{
//char *preorder = "ABDEGCFH";
//char *inorder = "DBEGAHFC";
//char *preorder = "ABEKLFGMCHDIJ";
//char *inorder = "KLEFMGBHCIJDA";
char *preorder = "GCABFED";
char *inorder = "ACBGDEF";
int n = strlen(preorder);
btnode *root = build_from_preorder_and_inorder(preorder, inorder, n);
postorder(root);
printf("\n");
return 0;
}