(一)112题
题目地址:https://leetcode-cn.com/problems/path-sum/description/
题目描述:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
解决方案:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root==NULL){
return false;
}
int t=sum-root->val;
if(root->left==NULL&& root->right==NULL){
return t==0 ? true :false;
}
//递归调用函数,分别判断根结点的左节点和右节点
return hasPathSum(root->left,t) || hasPathSum(root->right,t);
}
};
备注:这里的解决方案,采用递归调用的形式,每次开始都从sum中减去到根结点的值,然后再判断当前的节点作为根结点到其左孩子和右孩子的距离与t的关系。
性能分析:
大神的写法就是厉害,这个故事告诉我们递归调用性能真的很优,下次直觉想到循环调用的时候,可以考虑一下递归调用
(二)113题
题目地址:https://leetcode-cn.com/problems/path-sum-ii/description/
题目描述:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
解决方案:
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int>> res;
vector<int> out;
worker(root,sum,out,res);
return res;
}
//递归调用,实现对节点的路径总和判断和路径记录功能
void worker(TreeNode* node,int sum,vector<int>& out,vector<vector<int>>& res){
if(!node) return;
out.push_back(node->val);
if(sum==node->val && !node->left && !node->right)
{
res.push_back(out);
}
worker(node->left,sum-node->val,out,res);
worker(node->right,sum-node->val,out,res);
out.pop_back();
}
};
备注:同样使用递归调用,但由于代码较长,多写了一个函数,函数实现对二叉树中不同节点的处理进行记录。其中res为满足要求或者等待判断的当前路径,out是在新加入的路径不符合要求时,退出的节点。
性能分析:
说明:这个故事告诉我们遇到不会的问题,参考学习大神的代码没有问题,哪怕学习思路涨涨见识也好
(三)437题
题目地址:https://leetcode-cn.com/problems/path-sum-iii/description/
题目描述:
给定一个二叉树,它的每个结点都存放着一个整数值。
找出路径和等于给定数值的路径总数。
路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。
解决方案:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int pathSum(TreeNode* root, int sum) {
int cnt = 0;
dfs1(root, sum, cnt);
return cnt;
}
//dfs用来计算二叉树中符合要求的路径的长度
void dfs(TreeNode* root, int sum, int& cnt){
if(root == NULL) return;
//累计符合要求的路径个数
if(root->val == sum) cnt++;
dfs(root->left, sum-root->val, cnt);
dfs(root->right, sum-root->val, cnt);
}
//用来遍历每个节点
void dfs1(TreeNode* root, int sum, int& cnt){
if(root == NULL) return;
dfs(root, sum, cnt);
dfs1(root->left, sum, cnt);
dfs1(root->right, sum, cnt);
}
};
分析:较II题多了一个遍历二叉树节点的函数
性能分析:
分析:看了三篇大神写的代码,发现实现相同功能的不同写法,其实可以相互借鉴一下