题目:
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 targetSum 。
思路:
深度搜索和宽度搜索
代码1(dfs):
- 考虑根节点为空
- 考虑只有根节点
- 考虑根节点左右子树是否有满足sum-root->val的情况
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if (root == nullptr)
return false;
if (root->left == nullptr && root->right == nullptr)
return sum == root->val;
else
return hasPathSum(root->left, sum - root->val)||hasPathSum(root->right, sum - root->val);
}
};
代码2(bfs):
- 考虑根节点为空
- 设计一个队列进行节点访问顺序记录,访问节点的左右儿子
- 当节点的路径之和满足sum且其是叶子节点时,返回ture
- 当队列节点为空时,查找结束
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if (root == nullptr) {
return false;
}
queue<TreeNode *> que_node;
queue<int> que_val;
que_node.push(root);
que_val.push(root->val);
while (!que_node.empty()) {
TreeNode *now = que_node.front();
int temp = que_val.front();
que_node.pop();
que_val.pop();
if (now->left == nullptr && now->right == nullptr) {
if (temp == sum) {
return true;
}
continue;
}
if (now->left != nullptr) {
que_node.push(now->left);
que_val.push(now->left->val + temp);
}
if (now->right != nullptr) {
que_node.push(now->right);
que_val.push(now->right->val + temp);
}
}
return false;
}
};
收获:
巩固队列操作
front() 返回队列头元素
back()返回队列尾元素
pop() 弹出队列头元素
push()压入一个元素到队尾
empty()判断队列是否为空
size()返回队列元素个数