携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第39天,点击查看活动详情 >>
迭代法求解二叉树路径之和
上次介绍了递归法如何求解二叉树路径之和的问题(是否存在路径之和等于给定的目标值),那么这一次我们继续来介绍一种新方法用迭代法来看看如何求解
算法分析
这里介绍的迭代法讲求的是对树的层次遍历,在每一层的逐步遍历过程中实现了对题目的要求。
这里因为是要先求出具体路径之和,所以我们还是需要一个额外的队列去记录路径之和的值,只有这样我们才能在不断层次遍历的时候,将路径之和统计到。
在这过程中,如果遇到了叶子结点则进行处理,如果遇到的结点不是叶子结点的话,那就继续执行层次遍历应有的代码逻辑。
算法代码的具体实现:
Queue<TreeNode> queue1 = new LinkedList<>();
Queue<Integer> queue2 = new LinkedList<>();
第一个队列是层次遍历所用到的,而第二个队列就是上面提到的要对路径之和进行统计的路径之和的队列。
// 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回true
if (node.left == null && node.right == null && sum == targetSum) {
return true;
}
在遇到叶子节点的时候说明路径已经走到了最后,所以这时候就要判断路径的所有值之和是否是和目标值一样了,如果一样就直接返回true,如果不一样的话,就需要继续处理,即求取其他路径之和,看看是否存在路径之和与目标值一致。
若所有路径之和都不等于目标值,则返回false,程序停止。
具体实现代码如下:
public boolean hasPathSum(TreeNode root, int targetSum) {
/* getPathSum(root, 0, targetSum);
return tag;*/
if (root == null) {
return false;
}
Queue<TreeNode> queue1 = new LinkedList<>();
Queue<Integer> queue2 = new LinkedList<>();
queue1.add(root);
queue2.add(root.val);
while (!queue1.isEmpty()) {
int size = queue1.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue1.poll();
int sum = queue2.poll();
// 如果该节点是叶子节点了,同时该节点的路径数值等于sum,那么就返回true
if (node.left == null && node.right == null && sum == targetSum) {
return true;
}
// 右节点,压进去一个节点的时候,将该节点的路径数值也记录下来
if (node.right != null) {
queue1.add(node.right);
queue2.add(sum + node.right.val);
}
// 左节点,压进去一个节点的时候,将该节点的路径数值也记录下来
if (node.left != null) {
queue1.add(node.left);
queue2.add(sum + node.left.val);
}
}
}
return false;
}
总结:
这一次我们主要是介绍了如何通过迭代法(层次遍历)去统计二叉树的路径之和,并在这过程中判断一下它是否和题目给定的目标值一致,如果一致,则返回true,如果两者不同,则返回false。