从前序与中序遍历序列构造二叉树【leetcode-105】
运行效率
代码如下
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 是同一棵树的后序遍历,请构造二叉树并返回其根节点。
运行效率
代码如下
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);
}