树的深度优先遍历
核心就是遍历左儿子右儿子,每一个节点都是一个struct,不同于以往的数组模拟链表,这样的struct链表更加好理解,但是用时较长,这一题偏向模板题,不卡常,所以没有问题。
左儿子有就遍历进去左儿(if(root->left)dfs(root->left,s,sum)),右儿子有就遍历进去右儿子(if(root->right)dfs(root->right,s,sum))
注意在搜索的时候如果根节点是空节点则直接返回就可以了,因为后面的对空节点取权值(val)等操作都做不了了,自然也就段错误了,所以我们要避免这种情况,(if(root==NULL)return)这样的话就可以呃在 [NULL] 0的情况下ac了
/**
* 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:
vector<vector<int>> ans;
vector<int>temp;
vector<vector<int>> findPath(TreeNode* root, int sum) {
dfs(root,0,sum);
return ans;
}
void dfs(TreeNode* root,int s,int sum)
{
if(root==NULL)return;//很关键,没有这一行不给ac
s+=root->val;
temp.push_back(root->val);
if(root->left==NULL&&root->right==NULL)
{
if(s==sum)ans.push_back(temp);
}
if(root->left)
{
dfs(root->left,s,sum);
}
if(root->right)
{
dfs(root->right,s,sum);
}
temp.pop_back();
}
};
ruo子,你咋不直播来刷题了?
过一阵子来直播刷算法题