一:题目分析
对于本道题可以分为以下几个步骤:
1.后序数组为0 为空节点
2.后序数组中的最后一个元素为根节点
3.在中序数组中以根节点为分界线 切割左右子树
4.切中序数组
5.切后序数组
6.递归处理左区间右区间
中序:左中右 inorder
后序: 左右中 postorder
后序遍历的最后一个节点是整个二叉树的根节点,可以根据这一条来找到root节点,然后用root节点去中序遍历中 将其分为左右子树,依据递归,进行后续的二叉树子树继续分解,知道没有节点为止。
二:代码实现
var buildTree = function(inorder, postorder) {
if(!postorder.length) return null;
const rootVal = postorder.pop() // 从后序遍历的数组中取出最后一个节点
let rootIndex = inorder.indexOf(rootVal) // 取根节点在中序遍历中的下标
let root = new TreeNode(rootVal) // 创建根节点
// 递归的单层逻辑
// 左子树
root.left = buildTree(inorder.slice(0,rootIndex),postorder.slice(0,rootIndex))
// 右子树
root.right = buildTree(inorder.slice(rootIndex+1),postorder.slice(rootIndex));
return root;
};