从二叉树遍历序列中恢复二叉树

124 阅读1分钟

从前序与中序遍历序列构造二叉树【leetcode-105】

运行效率

R3]]JBWD(~%P7Z$VSA741.png

代码如下

var buildTree = function (preorder = [], inorder = []) {
  return buildTBTree(preorder, inorder, 0, inorder.length - 1);
};

function buildTBTree(preorder = [], inorder = [], iB, iE) {
  if (iB > iE) return;
  let tR = preorder.shift();
  let index = iB;
  for (let i = iB; i <= iE; i++) {
    if (inorder[i] === tR) {
      index = i;
      break;
    }
  }
  return new TreeNode(
    tR,
    buildTBTree(preorder, inorder, iB, index - 1),
    buildTBTree(preorder, inorder, index + 1, iE)
  );
}

从中序遍历和后序遍历序列构造二叉树【leetcode-106】

题目描述

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

运行效率

test.png

代码如下


function buildTree(inorder: number[], postorder: number[]): TreeNode | null {
  function recoverTree(is: number, ie: number, ps: number, pe: number) {
    const root = new TreeNode(postorder[pe]); //取出根节点
    const ri = indexOf(inorder, is, ie, postorder[pe]);
    let ed = -1;
    if (ri > is) {
      root.left = recoverTree(is, ri - 1, ps, ri - is - 1 + ps);
    }
    if (ri < ie) {
      root.right = recoverTree(ri + 1, ie, ri - is + ps, pe - 1);
    }
    return root;
  }

  function indexOf(arr: number[], s: number, e: number, target: number) {
    let t = 0;
    while (s <= e) {
      if (arr[s] === target) {
        return s;
      }
      s++;
    }
    return -1;
  }

  return recoverTree(0, inorder.length - 1, 0, postorder.length - 1);
}