打卡-算法训练营-Day16 |513.找树左下角的值;112. 路径总和;113. 路径总和ii;106.从中序与后序遍历序列构造二叉树

92 阅读1分钟

找树左下角的值

leetcode链接:leetcode.cn/problems/fi…

要理解题目中的左下角的节点,其实是找最大深度的叶子节点,这个叶子节点可能是左节点也可能是右节点

var findBottomLeftValue = function(root) {
  let maxDeep = -Infinity;
  let result;

  // 要找的是最深的叶子节点,而不是最左侧的叶子节点
  let dfs = (node, deep) => {
    if (node.left === null && node.right === null) {
      // 说明是叶子节点
      if (deep > maxDeep) {
        maxDeep = deep;
        result = node.val;
      }
      return;
    }
    if (node.left) {
      deep++;
      dfs(node.left, deep);
      deep--; // 回溯
    }
    if (node.right) {
      deep++;
      dfs(node.right, deep);
      deep--; // 回溯
    }
  };

  dfs(root, 1);
  return result;
};

路径总和

257. 二叉树的所有路径的思路一致,需要额外的变量存储路径之和

注意:113.路径总和ii要收集符合要求的路径的时候,js需要深拷贝数组

/**
 * @param {TreeNode} root
 * @param {number} targetSum
 * @return {number[][]}
 */
var pathSum = function(root, targetSum) {
    let result = [];
    let path = [];
    let sum = 0;

    let dfs = (node) => {
        if (!node) return;

        path.push(node.val);
        sum += node.val;

        if (node.left === null && node.right === null) {
            if (sum === targetSum) {
                //需要深拷贝path
                result.push([...path]);
            }
            path.pop();
            sum -= node.val;
            return;
        }

        dfs(node.left);
        dfs(node.right);
        path.pop();
        sum -= node.val;
    }
    dfs(root);
    return result;
};

构造二叉树

两道题目的思路是一致的

后序的最后一个是根节点的值,前序的第一个是根节点的值

在确定根节点的下标后,可以获得左子树的前序、后序数组和右子树的前序、后序数组,递归循环即可

注意切割数组的下标区间

var buildTree = function(inorder, postorder) {
    if (!inorder.length) return null;

    let rootValue = postorder.pop();
    let root = new TreeNode(rootValue);

    // 获取根节点元素的下标
    let rootIndex = inorder.indexOf(rootValue);

    // 切割中序数组
    let leftInOrder = inorder.slice(0, rootIndex);
    let rightInOrder = inorder.slice(rootIndex + 1);
    
    // 切割后序数组
    let leftPostOrder = postorder.slice(0, rootIndex);
    let rightPostOrder = postorder.slice(rootIndex); // 不是rootIndex+1

    root.left = buildTree(leftInOrder, leftPostOrder);
    root.right = buildTree(rightInOrder, rightPostOrder);

    return root;
};