代码随想录算法训练营第十七天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

50 阅读1分钟

110.平衡二叉树

257.二叉树的所有路径

404.左叶子之和

110. 平衡二叉树

  • 注意点:每一层迭代的返回条件不要同时混淆高度和是否平衡的判断 -> 使用某个数作为不平衡的标志
var isBalanced = function(root) {
    const traverse = (node) => {
        if (!node)  return 0;

        const bL = traverse(node.left);
        if (bL === -1)  return -1;
        const bR = traverse(node.right);
        if (bR === -1)  return -1;
        
        return Math.abs(bL - bR) <= 1 ? 1 + Math.max(bL, bR) : -1;
    }

    return traverse(root) !== -1;
};

257. 二叉树的所有路径

  • 注意点:加入节点放在最开始以放入叶子结点的值
var binaryTreePaths = function(root) {
    const res = [];

    const backTrack = (arr, node) => {
        arr.push(node.val);
        if (!node.left && !node.right) {
            res.push([...arr]);
            return;
        }
        
        if (node.left) {
            backTrack(arr, node.left);
            arr.pop();
        }
        if (node.right) {
            backTrack(arr, node.right);
            arr.pop();
        }
    }

    backTrack([], root);
    return res.map((path) => {
        return path.join('->');
    })
};

404. 左叶子之和

  • 我的思路:在进入下一层前带上是否来自左子树的标志并以此判断是否把该叶子结点的值记入答案
  • 讲解的思路:遵循左右中的迭代顺序,判断左子树下的叶子结点进行加和(在左叶子结点的上一层做判断)
var sumOfLeftLeaves = function(root) {
    const traverse = (node, isL, num) => {
        if (!node)  return num;
        if (isL && !node.right && !node.left) {
            return num + node.val;
        } else if (!isL && !node.right && !node.left) {
            return num;
        }

        const vL = traverse(node.left, true, num);
        const rL = traverse(node.right, false, num);
        return vL + rL;
    }

    return traverse(root, false, 0);
};

var sumOfLeftLeaves = function(root) {
    if (!root)  return 0;

    let vL = sumOfLeftLeaves(root.left);
    if (root.left && !root.left.left && !root.left.right) {
        vL += root.left.val;
    }
    let vR = sumOfLeftLeaves(root.right);
    return vL + vR;
};