[LeetCode] 112. Path Sum

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 112. Path Sum相关的知识,希望对你有一定的参考价值。

二叉树的路径和。题意是给一个二叉树和一个数字sum。求是否有这样一条路径可以使得二叉树从根节点到叶子节点经过的所有的节点值之和等于sum。此题可以用BFS和DFS两种做法解决,时间和空间复杂度都是O(n)。例子如下,

Example:

Given the below binary tree and sum = 22,

      5
     /     4   8
   /   /   11  13  4
 /        7    2      1

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

DFS,比较直观,直接上代码了。

 1 /**
 2  * Definition for a binary tree node.
 3  * function TreeNode(val) {
 4  *     this.val = val;
 5  *     this.left = this.right = null;
 6  * }
 7  */
 8 /**
 9  * @param {TreeNode} root
10  * @param {number} sum
11  * @return {boolean}
12  */
13 var hasPathSum = function(root, sum) {
14     if (root === null) return false;
15     if (root.left === null && root.right === null) return sum === root.val;
16     return (
17         hasPathSum(root.left, sum - root.val) ||
18         hasPathSum(root.right, sum - root.val)
19     );
20 };

 

BFS

用一个queue存储遍历到的节点。当加入某个节点的时候,如果这个节点没有孩子节点,需要判断加入这个节点之后的值是否等于sum;如果这个节点有孩子节点,接着遍历它的孩子节点,将cur.val + cur.left.val (cur.val + cur.right.val)加入queue。

 1 /**
 2  * @param {TreeNode} root
 3  * @param {number} sum
 4  * @return {boolean}
 5  */
 6 var hasPathSum = function(root, sum) {
 7     if (!root) return false;
 8     let queue = [root];
 9     while (queue.length) {
10         let cur = queue.shift();
11         if (!cur.left && !cur.right && cur.val === sum) {
12             return true;
13         }
14         if (cur.left) {
15             cur.left.val += cur.val;
16             queue.push(cur.left);
17         }
18         if (cur.right) {
19             cur.right.val += cur.val;
20             queue.push(cur.right);
21         }
22     }
23     return false;
24 };

以上是关于[LeetCode] 112. Path Sum的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 112 Path Sum

Leetcode 112: Path Sum

LeetCode 112. Path Sum

LeetCode_112. Path Sum

LeetCode Oj 112. Path Sum 解题报告

[Leetcode] Binary tree--112. Path Sum