アイデア:
特定のアイデアもコードに含まれています。つまり、左右のノードがどれだけの価値を提供できるかを確認するには、コードの詳細を慎重に検討する必要があります。
ソリューションリンク!
コード:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int dfs(TreeNode* root){
if(root==NULL) return 0;
// 递归计算左右子节点的最大贡献值
// 只有在最大贡献值大于 0 时,才会选取对应子节点
int left = dfs(root->left);
int right = dfs(root->right);
int cur = root->val;
// 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
if(left>0) cur+=left;
if(right>0) cur+=right;
Max = max(Max,cur);
// 返回节点的最大贡献值
return max(root->val,max(left,right)+root->val); //好好想想这句代码
}
int maxPathSum(TreeNode* root) {
dfs(root);
return Max;
}
int Max = -99999999;
};
アイデア:この
質問は、事前注文トラバーサルのテンプレートに従って行うことができます。変数を使用して各再帰の値を記録し、ベクトルを使用して渡された各ノードの値を格納します。リーフノードに到達すると、ターゲット値ではないことがわかります。ターゲット値の場合は、ターゲットベクトルに配置します。最も重要な点は、バックトラックするときに、今回検出した値をpop_bcak()する必要があることです。
コード:
/**
* 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:
void dfs(TreeNode* root, int sum,vector<vector<int> >& q,int book,vector<int> &sk){
book+=root->val;
sk.push_back(root->val);
bool ans = (root->left==NULL && root->right==NULL);
if(ans && book==sum){
q.push_back(sk);
}
if(root->left!=NULL) dfs(root->left,sum,q,book,sk);
if(root->right!=NULL) dfs(root->right,sum,q,book,sk);
sk.pop_back();
return ;
}
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<vector<int> > q;
if(root==NULL) return q;
vector<int> sk;
dfs(root,sum,q,0,sk);
return q;
}
};