由二叉树的前序、中序遍历结果,重建二叉树

**前序遍历的第一个元素为根节点,在中序遍历中:根节点左右两侧即为左右子树的中序遍历结果。**

思路:

  1. 找到前序遍历的根节点在中序遍历中的位置
  2. 使用两个数组分别存储左子树的前序、中序遍历结果,递归构建左子树(中序结果为空--> 父节点为叶节点)
  3. 使用两个数组分别存储右子树的前序、中序遍历结果,递归构建右子树
  4. 将左右子树连接在当前根节点上
  • JavaScript实现
function TreeNode(val) {
    this.val = val;
    this.left = null;
    this.right = null;
}
function reConstructBinaryTree(pre, vin)
{
    const len = vin.length;
    if(!len) return null;//父节点为叶节点
    let root = new TreeNode(pre[0]);//当前根节点
    let target_idx = 0;
    for(let i = 0; i < len; i++){
        if(vin[i] == pre[0]){
            target_idx = i;
            break;
        }
    }
    let cur_pre = [],
        cur_vin = [];//左右子树的前中序遍历存储数组
    for(let i = 1; i <= target_idx; i++){//左子树
        cur_pre.push(pre[i]);//根节点之后加入与中序遍历等长的序列
        cur_vin.push(vin[i - 1]);//根节点之前的全部加入
    }
    root.left = reConstructBinaryTree(cur_pre, cur_vin);
    cur_pre.splice(0, cur_pre.length);
    cur_vin.splice(0, cur_vin.length);
    for(let i = target_idx + 1; i < len; i++){
        cur_pre.push(pre[i]);
        cur_vin.push(vin[i]);
    }
    root.right = reConstructBinaryTree(cur_pre, cur_vin);
    return root;
}
posted @ 2021-04-08 20:02  jimmy-cat  阅读(80)  评论(0编辑  收藏  举报