问题分类
自顶向下
非自顶向下
解题模板
自顶向下
# 一般路径:
vector<vector<int>>res;
void dfs(TreeNode*root,vector<int>path)
{
if(!root) return; //根节点为空直接返回0
path.push_back(root->val); //作出选择
if(!root->left && !root->right) //如果到叶节点
{
res.push_back(path);
return;
}
dfs(root->left,path); //继续递归
dfs(root->right,path);
}
# 给定和的路径:
void dfs(TreeNode*root, int sum, vector<int> path)
{
if (!root)
return;
sum -= root->val;
path.push_back(root->val);
if (!root->left && !root->right && sum == 0)
{
res.push_back(path);
return;
}
dfs(root->left, sum, path);
dfs(root->right, sum, path);
}
非自顶向下
int res=0;
int maxPath(TreeNode *root) //以root为路径起始点的最长路径
{
if (!root)
return 0;
int left=maxPath(root->left);
int right=maxPath(root->right);
res = max(res, left + right + root->val); //更新全局变量
return max(left, right); //返回左右路径较长者
}
题目列表(持续更新)
void construct(TreeNode* root,string path,vector<string>& paths){
if(root != nullptr){
path+=to_string(root->val);
if(root->left ==nullptr && root->right == nullptr){
paths.push_back(path);
}else{
path+="->";
construct(root->left,path,paths);
construct(root->right,path,paths);
}
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> paths;
construct(root,"",paths);
return paths;
}
int dfs(TreeNode* root,int sum){
if (!root){
return 0;
}
int ret = 0;
if(root->val == sum){
ret++;
}
ret+=dfs(root->left,sum-root->val);
ret+=dfs(root->right,sum-root->val);
return ret;
}
int pathSum(TreeNode* root, int sum) {
if(!root){
return 0;
}
int ret = dfs(root,sum);
ret+=pathSum(root->left,sum);
ret+-pathSum(root->right,sum);
return ret;
}
bool hasPathSum(TreeNode* root, int sum) {
if(root == nullptr){
return false;
}
if(root->left == nullptr && root->right == nullptr){
return sum == root->val;
}
return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
}
vector<int> x1;
void dfs(TreeNode* root , vector<vector<int>>& v,int sum){
if (!root){
return;
}
x1.emplace_back(root->val);
if(root->left == nullptr && root->right == nullptr && sum == root->val){
v.emplace_back(x1);
}
dfs(root->left,v,sum-root->val);
dfs(root->right,v,sum-root->val);
x1.pop_back(); //回溯
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<vector<int>> v;
if(!root){
return v;
}
dfs(root , v , targetSum);
return v;
}
int rootSum(TreeNode* root,int targetSum) {
if (!root) {
return 0;
}
int ret = 0;
if (root->val == targetSum) {
ret++;
}
ret += rootSum(root->left, targetSum - root->val);
ret += rootSum(root->right, targetSum - root->val);
return ret;
}
int pathSum(TreeNode* root, int targetSum)
{
if (!root) {
return 0;
}
int ret = rootSum(root, targetSum);
ret += pathSum(root->left, targetSum);
ret += pathSum(root->right, targetSum);
return ret;
}