代码随想录算法训练营第18天|二叉树

513. 找树左下角的值

最左边的结点的特性

1.只能是叶子结点,

2.必须考虑是最底层,所以要考虑树的深度

3.同样的深度考虑左子树

考虑迭代法,层序遍历

递归优点难搞的

js 复制代码
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
 //最左边的结点的特性
 //1.只能是叶子结点,
 //2.必须考虑是最底层,所以要考虑树的深度
 //3.同样的深度考虑左子树
 //考虑迭代法,层序遍历
var findBottomLeftValue = function(root) {
    let q = [root], res = [];

    while(q.length > 0){
        let len = q.length;
        let curLevel = [];
        for(let i = 0; i < len; i++){
            let curNode = q.shift();
            curLevel.push(curNode.val);
            if(curNode.left) q.push(curNode.left);
            if(curNode.right) q.push(curNode.right);
        }
        res.push(curLevel);
    }
    return res[res.length - 1][0];  
};

112. 路径总和

js 复制代码
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {boolean}
 */
var hasPathSum = function(root, targetSum) {
    if(!root) return false;
    let res = [];
    dfs(root, 0, res);
    console.log('res:',res);
    console.log(res.indexOf(targetSum));
    return res.indexOf(targetSum) === -1 ? false : true;
}

function dfs(node, sum, res){
    //叶子结点
    if(!node.left && !node.right){
        res.push(sum + node.val);
        return;
    }
    if(node.left) dfs(node.left, sum + node.val, res);
    if(node.right) dfs(node.right, sum + node.val, res);
}

113. 路径总和 II

js 复制代码
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {number[][]}
 */
var pathSum = function(root, targetSum) {
    if(!root) return [];
    let res = [];
    dfs(root, 0, res, [], targetSum);
    return res;
};


function dfs(node, sum, res, path, targetSum){
    path.push(node.val);
    sum += node.val;
    //叶子结点
    if(!node.left && !node.right){
        if(sum  === targetSum){
            res.push([...path]);//这里不能直接res.push(path),因为JS中数组是直接传引用的,所以最后return的res中的那个数组,就是被修改过的path数组,这里用扩展运算符
        } 
        return;
    }
    if(node.left){
        dfs(node.left, sum, res, path, targetSum);
        path.pop();
    } 
    if(node.right){
        dfs(node.right, sum, res, path, targetSum);
        path.pop();
    } 
}

106. 从中序与后序遍历序列构造二叉树

能过,但是会超内存,之后在改进吧

js 复制代码
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} inorder
 * @param {number[]} postorder
 * @return {TreeNode}
 */
var buildTree = function(inorder, postorder) {
    //中序。  左中右
    //后序。  左右中
    if(inorder.length == 0) return null;
    let val = postorder[postorder.length - 1];
    let root = new TreeNode(val);

    let index = inorder.indexOf(val);
    let leftInOrder = inorder.slice(0, index);
    let rightInOrder = inorder.slice(index + 1);

    let index2 = postorder.indexOf(leftInOrder[leftInOrder.length - 1]);
    let leftPostOrder = postorder.slice(0, index2 + 1);
    let rightPostOeder = postorder.slice(index2 + 1, postorder.length - 1);


    root.left = buildTree(leftInOrder, leftPostOrder);
    root.right = buildTree(rightInOrder, rightPostOeder);
    return root;
};
相关推荐
大鱼>几秒前
宠物监控数据安全与隐私保护:端到端加密与合规实践
人工智能·深度学习·算法·iot·宠物
被自己蠢哭6 分钟前
BFS广度优先搜索问题:#P00496. 华为od机试—自动泊车
算法
:-)7 分钟前
分支限界算法
算法
大鱼>42 分钟前
宠物行为识别AI算法详解:从数据采集到模型部署的完整方案
人工智能·深度学习·算法·宠物
王莎莎-MinerU1 小时前
解析回归集:RAG 和 Agent 上线前,先把表格、公式、版面测清楚
人工智能·算法·数据挖掘·回归·pdf·ocr
KaMeidebaby1 小时前
卡梅德生物技术快报|兔单克隆抗体:噬菌体 Fab 免疫文库搭建实操:兔单克隆抗体重组构建完整参数
前端·网络·数据库·人工智能·算法
AndrewHZ1 小时前
【LLM技术全景】混合精度与分布式训练:训练大模型的工程奥秘
人工智能·分布式·深度学习·算法·ai·语言模型·llm
AI科技星2 小时前
基于全域数学公理体系求解三元约束极值题【乖乖数学】
人工智能·算法·机器学习·密码学·拓扑学·乖乖数学·全域数学
伊玛目的门徒9 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
Jerry10 小时前
LeetCode 226. 翻转二叉树
算法