描述
给定一个二叉树和一个值\ sum sum,判断是否有从根节点到叶子节点的节点值之和等于\ sum sum 的路径,
例如:
给出如下的二叉树,\ sum=22 sum=22,
返回true,因为存在一条路径 5\to 4\to 11\to 25→4→11→2的节点值之和为 22
示例1
输入:
{1,2},0
复制返回值:
false
复制
示例2
输入:
{1,2},3
复制返回值:
true
递归实现
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @param sum int整型
* @return bool布尔型
*/
//这道题 递归解法,找左右子树是否有 sum-root.val 的路径 不用打印路径了,相对简单一点
public boolean hasPathSum (TreeNode root, int sum) {
// write code here
if(root==null){
return false;
}
//处理叶子节点
if(root.left==null&&root.right==null){
if(root.val==sum){
return true;
}else{
return false;
}
}
boolean leftHas=hasPathSum(root.left,sum-root.val);
boolean rightHas=hasPathSum(root.right,sum-root.val);
boolean cur=leftHas||rightHas;
return cur;
}
}
非递归解决
上面使用的是递归的方式,我们还可以使用非递归的方式,在遍历的时候有两种方式,一种是从0开始累加,到叶子节点的时候如果累加的值等于sum,说明存在这样的一条路径。还一种是减,从根节点一直减下去,如果到叶子节点的时候,值等于叶子节点的值,说明也存在这样的一条路径。原理都一样,这里就以加的方式来看下代码该怎么写
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null)
return false;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);//根节点入栈
while (!stack.isEmpty()) {
TreeNode cur = stack.pop();//出栈
//累加到叶子节点之后,结果等于sum,说明存在这样的一条路径
if (cur.left == null && cur.right == null) {
if (cur.val == sum)
return true;
}
//右子节点累加,然后入栈
if (cur.right != null) {
cur.right.val = cur.val + cur.right.val;
stack.push(cur.right);
}
//左子节点累加,然后入栈
if (cur.left != null) {
cur.left.val = cur.val + cur.left.val;
stack.push(cur.left);
}
}
return false;
}
讲到树的BFS,就是一层一层的往下打印,像下面这样
他的代码如下
public void levelOrder(TreeNode tree) {
if (tree == null)
return;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(tree);//相当于把数据加入到队列尾部
while (!queue.isEmpty()) {
//poll方法相当于移除队列头部的元素
TreeNode node = queue.poll();
System.out.println(node.val);
if (node.left != null)
queue.add(node.left);
if (node.right != null)
queue.add(node.right);
}
}
在一层一层打印的时候,我们可以把值累加或累减都可以,这里使用累减的方式来看下代码
public boolean hasPathSum(TreeNode root, int sum) {
if (root == null)
return false;
Queue<TreeNode> queue = new LinkedList<>();
root.val = sum - root.val;
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
//累减到根节点之后,结果为0,说明存在这样一条路径,直接返回true
if (node.left == null && node.right == null && node.val == 0)
return true;
//左子节点累减
if (node.left != null) {
node.left.val = node.val - node.left.val;
queue.add(node.left);
}
//右子节点累减
if (node.right != null) {
node.right.val = node.val - node.right.val;
queue.add(node.right);
}
}
return false;
}