题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
知识回顾
- 前序遍历:
1.访问根节点
2.前序遍历左子树
3.前序遍历右子树 - 中序遍历:
1.中序遍历左子树
2.访问根节点
3.中序遍历右子树 - 后序遍历:
1.后序遍历左子树
2.后序遍历右子树
3.访问根节点
分析
做有关树、链表的题一定要有递归的思想,该题的解题思路可以分为:
1 确定根,确定左子树,确定右子树。
2 在左子树中递归。
3 在右子树中递归。
4 打印当前根。
代码
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function reConstructBinaryTree(pre, vin) {
if (pre.length === 0 || vin.length === 0) {
return null;
}
// 前序第一个是根节点,也是中序左右子树的分割点
let index = vin.indexOf(pre[0]);
let left = vin.slice(0, index);
let right = vin.slice(index + 1);
return {
val: pre[0],
// 递归左右子树的前序、中序
left: reConstructBinaryTree(pre.slice(1, index + 1), left),
right: reConstructBinaryTree(pre.slice(index + 1), right)
};
}
网友评论