/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param inorder int整型一维数组 中序遍历序列
* @param inorderLen int inorder数组长度
* @param postorder int整型一维数组 后序遍历序列
* @param postorderLen int postorder数组长度
* @return TreeNode类
*/
struct TreeNode* buildTree(int* inorder, int inorderLen, int* postorder,
int postorderLen )
{
if (inorderLen == 0)return NULL; //树为空
struct TreeNode*T=(struct TreeNode*)malloc(sizeof(struct TreeNode));
T->val = postorder[postorderLen - 1]; //树不为空创建根节点
int LeftNum = 0, RightNum = 0; //存储左右子树结点个数
int i=0;
//根据后序遍历可知,后序遍历的最后一个元素是根节点(并且在左右子树中也是如此)
//中序遍历根节点左边的结点是左子树的结点,右边的结点是右子树的结点
while(postorder[postorderLen-1]!=inorder[i])
{
i++; //遍历中序的数组直到找到根节点,i记录下左子树结点的个数
}
LeftNum=i; //此时i是根结点的下标,是左子树的结点个数
RightNum=inorderLen-i-1;
T->left=buildTree(inorder,LeftNum,postorder,LeftNum);//递归建立左子树
T->right=buildTree(inorder+i+1,RightNum, postorder+i,RightNum);//递归建立右子树
return T;
}