解法:递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* newTreeNode(int val)
{
struct TreeNode *root = malloc(sizeof(struct TreeNode));
root->val = val;
root->left = NULL;
root->right = NULL;
return root;
}
struct TreeNode* myBuildTree(int *pre, int *in, int preL, int preR, int inL, int inR)
{
// pre:先序序列, in:中序序列
// [preL, preR]先序序列区间, [inL, inR]中序序列区间
// 递归终止
if(preL > preR) return NULL;
// 找到根节点在中序序列中的位置
struct TreeNode* root = newTreeNode(pre[preL]);
int inK;
for(inK = inL; inK<=inR; inK++)
{
if(pre[preL] == in[inK]) break;
}
//划分左子树与右子树
int nL = inK - inL;//左子树节点数
// 根节点的左孩子是左子树的根节点
root->left = myBuildTree(pre, in, preL+1, preL+nL, inL, inK-1);
// 根节点的右孩子是右子树的根节点
root->right = myBuildTree(pre, in, preL+nL+1, preR, inK+1, inR);
return root;
}
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
struct TreeNode *root = myBuildTree(preorder, inorder, 0, preorderSize-1, 0, inorderSize-1);
return root;
}