[112].路径总和
Posted Debroon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[112].路径总和相关的知识,希望对你有一定的参考价值。
路径总和
题目
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \\
4 8
/ / \\
11 13 4
/ \\ \\
7 2 1
返回 true,因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
函数原型
C
的函数原型:
bool hasPathSum(struct TreeNode* root, int sum)
边界判断
bool hasPathSum(struct TreeNode* root, int sum)
if( root == NULL )
return false;
算法设计:递归
目标是找到从根到叶的路径,和为 22。
如果左右某个子树中存在一个从根到叶的路径和为 17,再连上根结点的 5,正好是 17 + 5 = 22。
我们把整个的 sum = 22 的问题变成了两个子树上的 sum = 17 问题,就可以对自身递归调用。
bool hasPathSum(TreeNode* root, int sum)
if (root == NULL) return sum == 0;
int target = sum - root->val;
return hasPathSum(root->left, target) || hasPathSum(root->right, target);
可当树为空树、sum = 0 时,我们的代码会错误地返回 true。
bool hasPathSum(struct TreeNode* root, int sum)
if( root == NULL ) return false;
// 凡是题目描述里提到叶结点的,都需要显式判断叶结点,在叶结点处结束递归
if( root->left == NULL && root->right == NULL ) // 显式判断叶结点:在叶结点的两个空子树处判断并结束递归,改为在叶结点处进行判断并结束递归
return (root->val - sum) == 0;
return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
以上是关于[112].路径总和的主要内容,如果未能解决你的问题,请参考以下文章