shaojinghong / Algorithms

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

二叉树路径总和【一】

shaojinghong opened this issue · comments

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。
原题地址:https://leetcode-cn.com/problems/path-sum/

可有求所有二叉树路径的算法改进得到:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} sum
 * @return {boolean}
 */
var hasPathSum = function(root, sum) {
 if (!root) return [];
  var stringBuffer = [];
  var result = [];

  function sumArr(arr){
    return arr.reduce(function(prev,cur){
      return prev + cur;
    }, 0);
  }

  function visit(root) {
    if (!root) return 
    stringBuffer.push(root.val);
    visit(root.left);
    visit(root.right);
    if (!root.left && !root.right) {
      result.push(sumArr(stringBuffer) === sum);
    }
    //这个是关键步骤
    stringBuffer.length --;
  }
  visit(root);
  return result.indexOf(true) !== -1;
}

左右子树递归法:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} sum
 * @return {boolean}
 */
var hasPathSum = function(root, sum) {
  if (!root) return false;
  if (!root.left && !root.right) {
  	return root.val - sum == 0;
  }
  return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);
};