广度优先搜索:
广度优先搜索(Breadth-First Search,简称BFS)是一种用于遍历或搜索树或图的算法。这个算法从根节点(或任意一个节点)开始,并探索最靠近根节点的邻居节点。如果所有邻居节点都已被访问过,搜索则回溯到发现邻居节点的节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
广度优先搜索的实现通常依赖于队列数据结构。 在搜索开始时,首先将根节点放入队列中。然后,在每一步中,算法都会检查队列中的第一个节点,并访问其所有尚未访问过的邻居节点。这些邻居节点随后被添加到队列的末尾。然后,算法从队列中删除当前节点,并继续处理队列中的下一个节点。
官方题解
解题思想
使用队列辅助完成BFS(广度优先搜索算法)
创建树节点队列queue和整数队列qval用于存储节点和节点中的值
首先将根节点和其值加入队列中
当queue不为空的时候,根据队列先进先出的特点,从队列中poll()取出节点
对当前节点判断,如果当前节点是叶子节点,且其值和从根节点开始的路径上的所有值累加起来等于target目标值,则返回true,否则退出当前循环
如果当前节点不为叶子节点,则先判断其左节点是否为空,如果不为空,则将左节点放入队列中并将其值和当前路径上的值累加起来,同理,再判断当前节点的右节点。
代码实现:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null)
{
return false;
}
//使用队列来辅助完成DFS(广度优先搜索)
Queue<TreeNode> queue=new LinkedList<TreeNode>();
Queue<Integer> qval=new LinkedList<Integer>();
queue.offer(root);
qval.offer(root.val);
while(!queue.isEmpty())
{
TreeNode now=queue.poll();
int temp=qval.poll();
if (now.left == null && now.right == null) {
if (temp == targetSum) {
return true;
}
continue;
}
if(now.left!=null)
{
queue.offer(now.left);
qval.offer(now.left.val+temp);
}
if(now.right!=null)
{
queue.offer(now.right);
qval.offer(now.right.val+temp);
}
}
return false;
}
}