[路飞]_算法成长之路四十五,从前序与中序遍历序列构造二叉树

112 阅读1分钟

个人算法成长之路四十五!!!定期更新一些刷题过程中个人的思路以及理解。有兴趣的朋友们可以互动交流哈~

题目:

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

 

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

解题思路:

  • 构造二叉树,第一件事一定是找根节点,然后想办法构造左右子树。
  • 肯定要想办法确定根节点的值,把根节点找出来,然后递归构造左右子树即可 image.png
  • 前序遍历的第一个值preorder[0]就是根节点的值,在中序序列中查找根节点所在位置,找到了位置,此位置之前的就是左子树,此位置之后的就是右子树,递归即可
/**
 * @param {number[]} preOrder
 * @param {number[]} inOrder
 * @return {TreeNode}
 */
var buildTree = function (preOrder, inOrder) {
  const build = (preStart, preEnd, inStart, inEnd) => {
    if (preStart > preEnd) return null;
    // root 节点对应的值就是前序遍历数组的第一个元素
    let rootVal = preOrder[preStart];
    // rootVal 在中序遍历数组中的索引
    let index = inOrder.indexOf(rootVal);
    // 左子树个数
    let leftSize = index - inStart;
    // 先构造出当前根节点
    let root = new TreeNode(rootVal);
    // 递归构造左右子树
    root.left = build(preStart + 1, preStart + leftSize, inStart, index - 1);
    root.right = build(preStart + leftSize + 1, preEnd, index + 1, inEnd);
    return root;
  };
  return build(0, preOrder.length - 1, 0, inOrder.length - 1);
};