var isSameTree = function (p, q) {
  if (p === null && q === null) return true;
  if ((p === null && q !== null) || (p !== null && q === null) || p.val !== q.val) {
    return false;
  }
  return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
};
這題用 DFS 實作,有幾種狀況可以判斷兩個樹不同:
時間複雜度: O(n)
空間複雜度: O(1)
var zigzagLevelOrder = function (root) {
  const queue = [root];
  const result = [];
  let layerCounter = 1;
  while (queue[0]) {
    const layerNodesNum = queue.length;
    const layerValues = [];
    for (let i = 0; i < layerNodesNum; i++) {
      let curNode = queue.shift();
      layerValues.push(curNode.val);
      if (curNode.left) queue.push(curNode.left);
      if (curNode.right) queue.push(curNode.right);
    }
    layerCounter % 2 === 0 ? result.push(layerValues.reverse()) : result.push(layerValues);
    layerCounter++;
  }
  return result;
};
解題概念和 LeetCode 102 相當相似。
時間複雜度: O(n)
空間複雜度: O(n)
var pathSum = function (root, targetSum) {
  let pathNum = 0;
  const nodeMap = new Map();
  const DFS = (node, curSum) => {
    if (!node) return;
    curSum += node.val;
    if (curSum === targetSum) pathNum++;
    if (nodeMap.get(curSum - targetSum) > 0) pathNum += nodeMap.get(curSum - targetSum);
    if (!nodeMap.has(curSum)) {
      nodeMap.set(curSum, 1);
    } else {
      nodeMap.set(curSum, 1 + nodeMap.get(curSum));
    }
    if (node.left) DFS(node.left, curSum);
    if (node.right) DFS(node.right, curSum);
    nodeMap.set(curSum, nodeMap.get(curSum) - 1);
  };
  DFS(root, 0);
  return pathNum;
};
這題可以使用 DFS + HashMap 來解題。首先用 DFS 搜尋二元樹的各個路徑,並同時將經過路徑的所有節點總和記錄在 HashMap。

例如當前走過了 10 => 5 => 2 => 1 的路徑(綠色線圈起的部分),hashMap 會有以下鍵值對
{ 10: 1, 15: 1, 17: 1, 18: 1}
此時拿 18 - 8(targetSum) = 10,10 存在於 HashMap 中,就可以知道在這條路徑下有一段路的節點總和為 targetSum,這種是從樹的中間層開始總和為 targetSum 的情況,而另一種 case 是從根節點的總和等於 targetSum 的情況,
有點像是以前遇過的 prefix sum 的概念
而為了避免會重複計算到路徑,當搜尋完回到二元樹的上層節點時,要記得把 hashMap 中的路徑減掉,例如搜尋完回到節點 2,減掉 key 為 18 的路徑一次,回到節點 5,減掉 key 為 17 的路徑一次。
時間複雜度: O(n)
空間複雜度: O(n)
Path Sum III | Leet code 437 | Theory explained + Python code
贾考博 LeetCode 437. Path Sum III