力扣面试150(62/150)
8.21 106. 从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
我的思路:在上一道题目的启发下,我也是根据中序和后序的规律找到了根节点,并找到左右子树的数字,通过递归生成左右子树,最后构建。
我的代码:
var buildTree = function(inorder, postorder) {const len = postorder.length;if(len === 0) return null;let root = postorder[len- 1];let index = inorder.indexOf(root);let in1 = inorder.slice(0 , index); let in2 = inorder.slice(index + 1 , len); let post1 = postorder.slice(0 , in1.length);let post2 = postorder.slice(in1.length , len - 1);const left = buildTree(in1 , post1);const right = buildTree(in2 , post2);return new TreeNode(root , left , right);
};
总结:
它根据中序和后序遍历的结果正确地构建出二叉树。其核心思想是利用后序遍历的最后一个元素作为当前子树的根节点,然后在中序遍历中找到这个根节点的位置,从而将中序遍历序列划分为左子树和右子树。接着,根据左子树的长度,将后序遍历序列也相应地划分为左子树和右子树的后序遍历部分。最后,通过递归调用这个函数来构建左子树和右子树,并将它们连接到根节点上。你之前遇到的栈溢出错误,是因为在分割数组时错误地将根节点包含在了子数组中,导致递归无法终止。而当前版本的代码已经修正了这个问题,通过 slice(index + 1, len) 和 slice(0, index) 正确地排除了根节点,确保了每次递归处理的子树规模都在不断缩小,最终能够顺利构建出整棵树。