二叉树的修改与构造


一、 从中序与后序遍历序列构造二叉树

在这里插入图片描述

//  从中序与后序遍历序列构造二叉树
// 后序遍历的顺序是左右根 所以后序遍历的最后一个节点是根节点
// 中序遍历的顺序是左根右 
// 找到根节点之后,根据中序遍历的顺序,把树分为左子树和右子树
// 递归循环遍历
var buildTree = function(inorder, postorder) {
    // 用于找到根节点
    let post_id;
  // map返回一个新的数组,数组中的元素为原始数组调用函数处理后的值
    const id_map = new Map();
    const helper = (left,right) => {
        // 如果这里没有节点构造二叉树了,就返回null
        if (left >right) {
            return null;
        }
        // 将post_id 位置的元素作为当前子树根节点
        const root_val = postorder[post_id];
        // 更新根节点的值
        const root = new TreeNode(root_val);

        // 根据 root 所在位置分成左右两棵子树
        const index = id_map.get(root_val);

        post_id--;
        // 构造右子树
        root.right = helper(index + 1,right);
        // 构造左子树
        root.left = helper(left, index - 1);
        return root;
    }
    // 从后序遍历的最后一个元素开始
    post_id = postorder.length - 1;

    let idx = 0;
    // forEach 对数组的每个元素执行一次内部的函数
    inorder.forEach((val, idx) => {
        id_map.set(val, idx);
    });
    return helper(0, inorder.length - 1);
};

二、最大二叉树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//  最大二叉树
var constructMaximumBinaryTree = function(nums) {
    const construct = (nums,left,right)=>{
        if(left>right) return null;
        let best = left;
        // 找到数组中最大的数作为根结点
        for(let i = left+1; i <= right;i++){
            if(nums[i] > nums[best]){
                best = i;
            }
        }
        // node更新新的根节点
        const node = new TreeNode(nums[best]);
        // 遍历左子树
        node.left = construct(nums,left,best -1);
        // 遍历右子树
        node.right = construct(nums,best+1,right);
        return node;
    }
    // 传入数组,数组最左边,最右边的值
    return construct(nums,0,nums.length-1);
};

三、合并二叉树

在这里插入图片描述

//  合并二叉树
var mergeTrees = function(root1, root2) {
    if(root1 === null) return root2;
    if(root2 === null) return root1;
    //如果两棵树此结点都存在,将两个结点的值相加
    let newTree = new TreeNode(root1.val + root2.val);
    //先从左边开始搜索
    newTree.left = mergeTrees(root1.left, root2.left);
    newTree.right = mergeTrees(root1.right, root2.right);
    return newTree;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值