1. 题目
给你二叉树的根节点 root 和 一个表示目标和的整数 targetSum ,
判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
2. 思路
1. 首先根据输入的数组,构建二叉树
2. 使用递归的方式判断是否存在该路径
3. 实现
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
//1. 输入相关数据
int n = sc.nextInt(); //节点总数
int rootNum[] = new int[n];
for(int i=0;i<n;i++) {
rootNum[i] = sc.nextInt();
}
int targetSum = sc.nextInt();
//2. 根据输入的数据构建二叉树
TreeNode root = getTree(rootNum,n);
//System.out.println(root.right.val);
//3. 判断是否存在:目标和为targetSum的 根节点到叶子节点 的路径
//boolean res = isPathSum(root,targetSum,root.val);
boolean res = isPathSum2(root,targetSum);
System.out.println(res);
}
//(1)构建二叉树,使用队列
private static TreeNode getTree(int[] rootNum, int n) {
if(n==0) return null;
// 1.创建队列
Queue<TreeNode> q = new LinkedList<TreeNode>();
// 2.创建根节点,并将根节点入队
TreeNode root = new TreeNode(rootNum[0]);
q.add(root);
// 3.设置遍历数组的初值和暂存临时出队的节点
int k=1;
TreeNode t = null;
// 4. 执行出队和入队操作。创建二叉树
while(!q.isEmpty() && k<n) {
// 4.1 出队节点
t = q.poll();
// 4.2 出队节点为空,不为其添加左右孩子,结束本次循环
if(t == null) {
continue;
}
// 4.3 为当前节点添加左孩子
if(rootNum[k]!=0) {//有左孩子
t.left = new TreeNode(rootNum[k]);
}else {//没有左孩子
t.left = null;
}
//左孩子入队(不管是否为空)
q.add(t.left);
k++;
if(k>=n) break; //避免越界
// 4.4 为当前节点添加右孩子
if(rootNum[k]!=0) {//有右孩子
t.right = new TreeNode(rootNum[k]);
}else {//没有右孩子
t.right = null;
}
//右孩子入队(不管是否为空)
q.add(t.right);
k++;
}
// 5.返回创建的二叉树
return root;
}
// (2)三个参数 判断是否存在:目标和为targetSum的 根节点到叶子节点 的路径.curSum记录当前和
private static boolean isPathSum(TreeNode root, int targetSum, int curSum) {
if(curSum == targetSum) return true;
boolean l = false, r=false;
if(root.left!=null) {
l = isPathSum(root.left,targetSum,curSum+root.left.val);
}
if(root.right!=null) {
r = isPathSum(root.right, targetSum, curSum+root.right.val);
}
return l || r;
}
// (3)两个参数 判断是否存在:目标和为targetSum的 根节点到叶子节点 的路径
private static boolean isPathSum2(TreeNode root, int targetSum) {
if(root == null) return false;
if(root.val == targetSum) return true;
return isPathSum2(root.left, targetSum-root.val) || isPathSum2(root.right, targetSum-root.val);
}
}
// 二叉树结构体
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val){
this.val = val;
this.left = null;
this.right = null;
}
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}