Skip to content
文档章节

BM29 二叉树中和为某一值的路径

方法一:前序遍历

  • 这里采用的是前序遍历的递归实现方法,即:根节点-左儿子-右儿子。
  • 具体思路如下图所示: bm29-1
ts
/*class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * @param root TreeNode类
 * @param sum int整型
 * @return bool布尔型
 */

export function hasPathSum(root: TreeNode, sum: number): boolean {
  // write code here
  if (!root) return false;

  if(!root.left && !root.right && root.val === sum) return true;
  
  return hasPathSum(root.left, sum-root.val) || hasPathSum(root.right, sum - root.val)
}

方法二:层次遍历

  • 同样我们也可以通过层次遍历,同步推进每一条路径在每一层的值,从而判断二叉树中是否存在节点和为指定值的路径。只需要去判断叶子节点的和是否为要求的值即可。
  • 具体思路如下图所示: bm29-2
ts
/*class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * @param root TreeNode类
 * @param sum int整型
 * @return bool布尔型
 */
type NodePair =  {
  node : TreeNode,
  sum: number
}

export function hasPathSum(root: TreeNode, sum: number): boolean {
  // write code here
  if (!root) return false;
  
  var nodepairs: NodePair[] = [];
  nodepairs.push({node: root, sum: root.val})
  
  while(nodepairs.length) {
    const nodepair: NodePair = nodepairs.pop();
    
    if(nodepair.node.left) {
      nodepairs.push({node: nodepair.node.left, sum:  nodepair.sum + nodepair.node.left.val} )
    }
    if(nodepair.node.right) {
      nodepairs.push({node: nodepair.node.right, sum:  nodepair.sum + nodepair.node.right.val} )
    }
    
    if(!nodepair.node.left && !nodepair.node.right ) {
      if(nodepair.sum === sum) return true;
    }
  }
  return false;
}