5.路径总和(定义二叉树结构体,根据数组创建二叉树,判断二叉树中是否存在指定和的路径)

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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值