8.20 105. 从前序与中序遍历序列构造二叉树
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历 , inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
我的思路:
找到左子树和右子树和根节点,直接new TreeNode生成,根节点就是preorder[0]
inorder在preorder[0]左边的是左子树的(0,index + 1),那就可以生成左子树
右边是右子树:(index,length)
我的代码:
var buildTree = function(preorder, inorder) {
const len = preorder.length
if(len === 0){
return null;
}
const root = preorder[0];
const index = inorder.indexOf(root);
const pre1 = preorder.slice(1,index + 1);
const pre2 = preorder.slice(index + 1);
const in1 = inorder.slice(0,index + 1);
const in2 = inorder.slice(index + 1);
const left = buildTree(pre1 , in1);
const right = buildTree(pre2 , in2);
return new TreeNode(root , left , right);
};
总结:
这段代码是一个经典的递归算法,用于根据前序遍历和中序遍历的结果来重建一棵二叉树。其核心思想在于巧妙地利用了两种遍历的特性。前序遍历的第一个元素永远是当前子树的根节点,而中序遍历中,根节点位于中间,其左侧是左子树的所有节点,右侧是右子树的所有节点。代码首先从前序遍历中取出根节点,然后在中序遍历中找到该根节点的位置,从而将中序遍历序列划分为左右两部分,分别对应左子树和右子树。接着,根据中序遍历划分出的左右子树长度,相应地从前序遍历中切出左右子树的部分。最后,代码通过递归调用自身,为左右子树重复上述过程,构建出完整的左右子树,并将它们与当前根节点连接起来,最终返回构建好的二叉树根节点。这种方法逻辑清晰,直观地体现了分治的思想。