程式碼隨想錄演算法訓練營第第18天 | 513.找樹左下角的值 、112. 路徑總和 、106.從中序與後序遍歷序列構造二叉樹

YuanYF6發表於2024-05-26

找樹左下角的值

本地遞迴偏難,反而迭代簡單屬於模板題, 兩種方法掌握一下
題目連結/文章講解/影片講解:https://programmercarl.com/0513.找樹左下角的值.html


/**
 * 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}
 */
var findBottomLeftValue = function(root) {
    let result = root.val;
    let maxDep = -Infinity;
    const traverse = (node, depth) => {
        if (node.left === null && node.right === null) {
            if (maxDep < depth) {
                maxDep = depth;
                result = node.val;
            }
            return;
        }
        if (node.left) {
            traverse(node.left, depth+1);
        }
        if (node.right) {
            traverse(node.right, depth+1);
        }
    }
    traverse(root, 0);
    return result
};

路徑總和

本題 又一次設計要回溯的過程,而且回溯的過程隱藏的還挺深,建議先看影片來理解
112. 路徑總和,和 113. 路徑總和ii 一起做了。 優先掌握遞迴法。
題目連結/文章講解/影片講解:https://programmercarl.com/0112.路徑總和.html

這題自己寫出跟題解不一樣的遞迴,總算可以自己寫出來了
function getTotal(node, total, target) {
    if (node.left === null && node.right === null) {
        total += node.val;
        if (total === target) {
            return true;
        } else {
            total -= node.val;
            return false;
        }
    }
    total += node.val
    if (node.left) {
        let flag = getTotal(node.left, total, target);
        if (flag) {
            return true;
        }
    }
    if (node.right) {
        let flag = getTotal(node.right, total, target);
        if (flag) {
            return true;
        }
    }
    total -= node.val;
    return false;

}

/**
 * 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 == null) return false;
    let total = 0;
    let flag =  getTotal(root, total, targetSum);
    return flag;
};

從中序與後序遍歷序列構造二叉樹

本題算是比較難的二叉樹題目了,大家先看影片來理解。
106.從中序與後序遍歷序列構造二叉樹,105.從前序與中序遍歷序列構造二叉樹 一起做,思路一樣的
題目連結/文章講解/影片講解:https://programmercarl.com/0106.從中序與後序遍歷序列構造二叉樹.html

這題好難,基本沒思路
/**
 * 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) return null;
    let rootVal = postorder.pop();
    let index = inorder.indexOf(rootVal);
    let root = new TreeNode(rootVal);
    root.left = buildTree(inorder.slice(0,index), postorder.slice(0,index));
    root.right = buildTree(inorder.slice(index+1), postorder.slice(index,))
    return root;
};

相關文章