重建二叉树
- 题源:《剑指 Offer: 面试题 7》P62
- 在线:LeetCode: 105
题目
根据一棵树的前序遍历与中序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。
例如,给出:
前序遍历 preorder = [1, 2, 4, 7, 3, 5, 6, 8]
中序遍历 inorder = [4, 7, 2, 1, 5, 3, 8, 6]
返回如下的二叉树:
图:构造后的二叉树
思路
- 从前序遍历确定根结点
- 在中序遍历找到根结点,将其分为左右子树
- 根据中序遍历左右子树的个数,将前序遍历也分为对应的左右子树
- 对左右子树的前序和中序再分别进行递归求解
- 最后返回根节点
图:确定根结点后划分左右子树(前序和中序都要划分)
代码实现
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
function buildTree(preorder, inorder) {
if (preorder.length !== inorder.length || inorder.length === 0) {
return null;
}
let root = new TreeNode(preorder[0]);
let i = inorder.indexOf(preorder[0]);
root.left = buildTree(preorder.slice(1, i + 1), inorder.slice(0, i));
root.right = buildTree(preorder.slice(i + 1), inorder.slice(i + 1));
return root;
}
拓展
- 如何从中序与后序遍历序列构造二叉树?LeetCode: 106
- 前序遍历和后序遍历可以构造二叉树吗?