框架如下:关键点在于stack.push_back();以及stack.pop_back()的时间点。
void function(TreeNode* root , vector<int>& stack)
{
if(root != NULL)
{
stack.push_back(root->val);
function(ret , root->left , stack);
function(ret , root->right , stack);
stack.pop_back();
}
}
练习题目:(注意结合上面的框架)
(1)力扣1448:统计二叉树中好节点数目。
解答:
class Solution {
public:
int goodNodes(TreeNode* root) {
int ret = 0;
vector<int> stack;
function(ret , root , stack);
return ret;
}
void function(int& ret , TreeNode* root , vector<int>& stack)
{
if(root != NULL)
{
stack.push_back(root->val);
int pre = root->val;
ret += 1;
for(int i = 0 ; i < stack.size() - 1 ; i++)
{
if(stack[i] > pre)
{
ret -= 1;
break;
}
}
function(ret , root->left , stack);
function(ret , root->right , stack);
stack.pop_back();
}
}
};
(2)力扣113:路径总和Ⅱ。
解答:
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
vector<vector<int>> ret;
int sum = 0;
vector<int> track;
function(targetSum , sum , root , track , ret);
return ret;
}
void function(int& targetSum , int& sum , TreeNode* root , vector<int>& track , vector<vector<int>>& ret)
{
if(root != NULL)
{
track.push_back(root->val);
sum += root->val;
if(root->left == NULL && root->right == NULL)
{
if(sum == targetSum)
ret.push_back(track);
}
function(targetSum , sum , root->left , track , ret);
function(targetSum , sum , root->right , track , ret);
sum -= root->val;
track.pop_back();
}
}
};
(3)力扣129:求根节点到叶节点数字之和:
class Solution {
public:
int sumNumbers(TreeNode* root) {
int ret = 0;
vector<int> track;
function(ret , root , track);
return ret;
}
void function(int& ret ,TreeNode* root , vector<int>& track)
{
if(root != NULL)
{
track.push_back(root->val);
if(root->left == NULL && root->right == NULL)
{
int sum;
for(int i = track.size() - 1 ; i >= 0 ; i--)
{
ret += track[i] * pow(10 , track.size() - 1 - i);
}
}
function(ret , root->left , track);
function(ret , root->right , track);
track.pop_back();
}
}
};