目录
112. 路径总和:
问题描述:
实现代码与解析:
递归:
原理思路:
迭代:
原理思路:
113. 路径总和 II:
问题描述:
实现代码与解析:
迭代:
原理思路:
112. 路径总和:
问题描述:
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 输出:true 解释:等于目标和的根节点到叶节点路径如上图所示。
示例 2:
输入:root = [1,2,3], targetSum = 5 输出:false 解释:树中存在两条根节点到叶子节点的路径: (1 --> 2): 和为 3 (1 --> 3): 和为 4 不存在 sum = 5 的根节点到叶子节点的路径。
示例 3:
输入:root = [], targetSum = 0 输出:false 解释:由于树是空的,所以不存在根节点到叶子节点的路径。
实现代码与解析:
递归:
class Solution {
public:
bool traversal(TreeNode* cur,int count)
{
if(cur==NULL) return false;
count-=cur->val;//减去当前结点的值
//走到了叶子结点
if(cur->left==NULL&&cur->right==NULL)
{
//若到这里count减为0,返回true,反之返回false
if(count==0) return true;
else return false;
}
bool left=traversal(cur->left,count);
bool right=traversal(cur->right,count);
return left||right;
}
bool hasPathSum(TreeNode* root, int targetSum)
{
bool result=traversal(root,targetSum);
return result;
}
};
精简版:
class solution {
public:
bool hasPathSum(TreeNode* root, int targetSum)
{
if (root == null) return false;
if (!root->left && !root->right && targetSum == root->val)
{
return true;
}
return haspathsum(root->left, targetSum - root->val) || haspathsum(root->right, targetSum - root->val);
}
};
原理思路:
这里我们不用一个个累加然后判断是否与sum相等,可以让count等于targetSum然后每到一个结点就减去该结点的值,判断count最后是否为0,就可以知道该路径符不符合要求了,然后注意每个判断条件返回的是false还是true我们返回的时候用的是 || 而不是我们常用的 && ,因为这里我们只要有一条路线符合条件就可以了。然后代码其实就是在遍历代码上添加一点上述的条件而已,就不详细解释了,大家看代码就能看懂。
迭代:
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum)
{
if(root==NULL) return false;
stack<pair<TreeNode*,int>> st;//放入<结点,路径值>
st.push(pair<TreeNode*,int>(root,root->val));
while(!st.empty())
{
pair<TreeNode*,int> temp=st.top();
st.pop();
//若为叶子结点,进行判断
if(!temp.first->left&&!temp.first->right&&targetSum==temp.second) return true;
if(temp.first->right)
{
st.push(pair<TreeNode*,int>(temp.first->right,temp.second+temp.first->right->val));
}
if(temp.first->left)
{
st.push(pair<TreeNode*,int>(temp.first->left,temp.second+temp.first->left->val));
}
}
return false;
}
};
原理思路:
这里我们用pair<TreeNode*,int>的结构来入栈,记录结点指针和当前结点与根结点的路径长,然后到叶结点判断其路径长是否与目标targetSum相等即可。
113. 路径总和 II:
问题描述:
给你二叉树的根节点 root
和一个整数目标和 targetSum
,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出:[[5,4,11,2],[5,8,4,5]]
示例 2:
输入:root = [1,2,3], targetSum = 5 输出:[]
示例 3:
输入:root = [1,2], targetSum = 0 输出:[]
实现代码与解析:
迭代:
class Solution {
public:
vector<vector<int>> result;//记录结果
vector<int> path; //记录路径
void traversal(TreeNode* cur,int count)
{
if(cur->left==NULL&&cur->right==NULL)
{
//符合条件
if(count==0)
{
result.push_back(path);
return;
}
//不符合条件直接返回
else
{
return;
}
}
//左不为空
if(cur->left)
{
path.push_back(cur->left->val);
traversal(cur->left,count-cur->left->val);//减去下一结点值,传入
path.pop_back();
}
//右不为空
if(cur->right)
{
path.push_back(cur->right->val);
traversal(cur->right,count-cur->right->val);//减去下一结点值,传入
path.pop_back();
}
return;
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum)
{
if (root == NULL) return result;
path.push_back(root->val);//先把头结点放入路径
traversal(root,targetSum-root->val);
return result;
}
};
原理思路:
与上一题原理相同,就是这里我们要求全部符合要求的路径,所以这里我们另外定义一个path来记录,递归时不用返回值。