题目:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
示例 2:
输入:inorder = [-1], postorder = [-1]
输出:[-1]
提示:
1 <= inorder.length <= 3000postorder.length == inorder.length-3000 <= inorder[i], postorder[i] <= 3000inorder和postorder都由 不同 的值组成postorder中每一个值都在inorder中inorder保证是树的中序遍历postorder保证是树的后序遍历
思路:与从前序与中序遍历序列构造二叉树思路大同小异,只是将前序换成了后序,后序根结点为后序数组最后一个;
代码:
cs
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize) {
if(inorderSize == 0 || postorderSize == 0){
return NULL;
}
// 存入中序遍历根结点索引
int indexroot = 0;
// 根节点赋值(后序遍历最后值为根结点)
struct TreeNode *root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
root -> val = postorder[postorderSize - 1];
// 寻找中序遍历中根结点
while (postorder[postorderSize - 1] != inorder[indexroot]){
indexroot++;
}
// 把左右子树结点作为新的根结点处理
//传入左子树的中序遍历和后序遍历
root -> left = buildTree(inorder,indexroot,postorder,indexroot);
root -> right = buildTree(inorder + indexroot + 1,inorderSize - indexroot - 1,postorder + indexroot,inorderSize - indexroot - 1);
return root;
}
总结:
主要后序遍历根结点为后序数组最后一位;