问题:给定一个二叉树的前序遍历和中序遍历结果,要求重建这个二叉树
二叉树前序遍历
先输出当前结点,再依次遍历输出左结点和右结点
二叉树中序遍历
先遍历输出左结点,再输出当前结点,再遍历输出右结点
根据前序中序遍历重建二叉树
思路:
- 前序遍历序列的第一个结点一定是根节点
- 在中序遍历序列中找到前序遍历第一个结点的位置,该位置前部为左子树部分,右部为右子树部分
- 依此类推
举例:
前序:ABDECFG
中序:DBEAFCG
1.根结点A
左子树:前序BDE 中序DBE
右子树:前序CFG 中序FCG
2.B
左子树:前序D 中序D
右子树:前序E 中序E
3.C
左子树:前序F 中序F
右子树:前序G 中序G
4.D
前序null 中序null 没有左右子树了
…
/* 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;
}
//找到根结点在中序遍历序列中的位置
var index = vin.indexOf(pre[0]);
//左子树的前序中序序列
var leftPre = pre.slice(1, index+1);
var leftVin = vin.slice(0, index);
//右子树的前序中序序列
var rightPre = pre.slice(index+1);
var rightVin = vin.slice(index+1);
var root = new TreeNode(pre[0]);
root.left = reConstructBinaryTree(leftPre, leftVin);
root.right = reConstructBinaryTree(rightPre, rightVin);
return root;
}