题目描述:
分析:前序可以确定根,通过根可以将中序划分成左、右子树。依次类推,前序的下一个节点可以将左子树分成左子树、右子树,将右子树分成左子树、右子树...
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
struct TreeNode* _buildTree(int* preorder, int* pindex, int* inorder, int inbegin, int inend)
{
//preorder:指向前序
//*pindex:前序的下标
//inorder:指向中序
//inbegin、inend:中序区间
if(inbegin>inend)//区间不存在,空树
{
return NULL;
}
struct TreeNode* root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val=preorder[*pindex];
(*pindex)++;
if(inbegin==inend)//区间只有一个结点,就是根结点
{
root->val=inorder[inbegin];
root->left=NULL;
root->right=NULL;
return root;
}
//区间正常
int rootindex=inbegin;
while(rootindex<=inend)//用前序的根划分中序为两个子区间
{
if(inorder[rootindex]==root->val)
{
break;
}
else
{
++rootindex;
}
}
//递归创建左子树
root->left= _buildTree(preorder, pindex, inorder, inbegin, rootindex-1);
//递归创建右子树
root->right= _buildTree(preorder, pindex, inorder, rootindex+1, inend);
return root;
}
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
int pindex=0;
return _buildTree(preorder, &pindex, inorder, 0, inorderSize-1);
}