112. 路径总和
查看题目简单
树
二叉树
图
低频
解法一:广度优先遍历
时间复杂度:O(n) | 空间复杂度:O(n) | 推荐使用
动画演示
准备就绪 - 输入二叉树(层序遍历,用逗号分隔)和目标总和,然后点击开始
代码实现
// 二叉树节点定义
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 sum) {
// 如果根节点为空,直接返回 false
if (root == null) {
return false;
}
// 创建两个队列:一个存储节点,一个存储对应的路径和
Queue<TreeNode> queNode = new LinkedList<TreeNode>();
Queue<Integer> queVal = new LinkedList<Integer>();
// 将根节点和根节点的值加入队列
queNode.offer(root);
queVal.offer(root.val);
// 当队列不为空时,继续处理
while (!queNode.isEmpty()) {
// 取出当前节点和对应的路径和
TreeNode now = queNode.poll();
int temp = queVal.poll();
// 如果当前节点是叶子节点
if (now.left == null && now.right == null) {
// 检查路径和是否等于目标值
if (temp == sum) {
return true;
}
// 继续处理其他路径
continue;
}
// 如果左子节点存在,将左子节点和更新后的路径和加入队列
if (now.left != null) {
queNode.offer(now.left);
queVal.offer(now.left.val + temp);
}
// 如果右子节点存在,将右子节点和更新后的路径和加入队列
if (now.right != null) {
queNode.offer(now.right);
queVal.offer(now.right.val + temp);
}
}
// 没有找到符合条件的路径
return false;
}
}时间复杂度:O(n)
空间复杂度:O(n)
检查根节点是否为空,如果为空则返回 false创建两个队列:一个用于存储节点,一个用于存储对应的路径和将根节点和根节点的值分别加入两个队列当队列不为空时,执行以下操作: a. 从队列中取出一个节点和对应的路径和 b. 如果该节点是叶子节点(左右子节点都为空),检查路径和是否等于目标 sum - 如果相等,返回 true c. 如果不是叶子节点,将左子节点加入队列,路径和为当前路径和加上左子节点的值 d. 同样处理右子节点当所有节点都处理完毕仍未找到符合条件的路径,返回 false