“这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战”
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 思路 二叉树的前序遍历第一个节点,即为根节点。找到中序遍历中根节点的位置,其左边的序列即为其左子树,右边的序列即为右子树,这样就把原序列划分为两个子序列,分别对两个子序列进行递归操作,就成功地构造了二叉树
已知某二叉树的前序遍历和中序遍历的结果,请重构出该二叉树(步骤详解,代码后补) 前序遍历序列{1,2,4,7,3,5,6,8} 中序遍历序列{4,7,2,1,5,3,8,6} step1 首先需要知道前中后序的遍历方式: 前序遍历:根左右 中序遍历:左根右 后序遍历:左右根
注意观察“根节点”的位置
针对于本题,前序+中序,先看前序,第一个元素“1”即为根节点,然后在中序遍历中标记出“1”所在位置 step2 在中序遍历中确认的根节点位置,则左右两边分别为左子树和右子树
step3 目光回到前序遍历,第二个元素是“2”,根据后序遍历序列可得“2”在“1”的左子树中,因此可画出部分二叉树如下:
注:前序遍历从左往右依此看元素,若是后序遍历则最后一个元素是根节点,并且从右往左看
step4 1.继续看前序遍历,第三个元素是“4”,而在后序遍历中,4在2的左边,可画部分二叉树如下: 2.继续看前序遍历,第四个元素是“7”,而在后序遍历中,7在4的右边,可画部分二叉树如下: 3.继续看前序遍历,第五个元素是“3”,而在后序遍历中,3在1的右边,可画部分二叉树如下: 4.继续看前序遍历,第六个元素是“5”,而在后序遍历中,5在3的左边,可画部分二叉树如下:
————————————————
function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
}
function reConstructBinaryTree(pre, vin) {
if(pre.length == 0) {
return 0;
}
var root = new TreeNode(pre[0]);//生成根节点
var root_index = vin.indexOf(root.val);//找到根节点在中序遍历中的位置
root.left = reConstructBinaryTree(pre.slice(1,root_index+1),vin.slice(0,root_index))
root.right = reConstructBinaryTree(pre.slice(root_index+1),vin.slice(root_index+1))
console.log(root)
return root;
}
var pre = [1,2,4,7,3,5,6,8];
var vin = [4,7,2,1,5,3,8,6];
reConstructBinaryTree(pre,vin);
运行截图