[路飞]leetcode-105.从前序与中序遍历序列构造二叉树

87 阅读1分钟

给定两个整数数组 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]

实现:

var buildTree = function (preorder, inorder) {
  if (!preorder.length || !inorder.length) {
    return null;
  }
  let inIndex = 0; 
  while (inorder[inIndex] != preorder[0]) ++inIndex;
  let le_pre = [],
    le_in = [],
    ri_pre = [],
    ri_in = [];
  for (let i = 0; i < inIndex; i++) {
    le_pre.push(preorder[i + 1]);
    le_in.push(inorder[i]);
  }
  for (let i = inIndex + 1; i < inorder.length; i++) {
    ri_pre.push(preorder[i]);
    ri_in.push(inorder[i]);
  }
  let root = new TreeNode(preorder[0]);
  root.left = buildTree(le_pre, le_in);
  root.right = buildTree(ri_pre, ri_in);
  return root;
};



var buildTree1 = function (preorder, inorder) {
    if(preorder.length===0)return null
    const rootVal = preorder[0];
    const inRootKey=inorder.indexOf(rootVal)
    const root=new TreeNode(rootVal)
    root.left=buildTree1(preorder.slice(1,inRootKey+1),inorder.slice(0,inRootKey))
    root.left=buildTree1(preorder.slice(inRootKey+1),inorder.slice(inRootKey+1))
    return root
}