02 根据前序中序遍历重建二叉树


问题:给定一个二叉树的前序遍历和中序遍历结果,要求重建这个二叉树

二叉树前序遍历

先输出当前结点,再依次遍历输出左结点和右结点

二叉树中序遍历

先遍历输出左结点,再输出当前结点,再遍历输出右结点

根据前序中序遍历重建二叉树

思路:

  1. 前序遍历序列的第一个结点一定是根节点
  2. 在中序遍历序列中找到前序遍历第一个结点的位置,该位置前部为左子树部分,右部为右子树部分
  3. 依此类推

举例:
在这里插入图片描述
前序: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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值