题目描述
给定一颗二叉树和一个整数 sum,求累加和为 sum 的最长路径长度。路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链。
输入描述:
第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。
以下 n 行每行四个整数 fa,lch,rch,val,表示 fa 的左儿子为 lch,右儿子为 rch。val 表示 fa 节点的值(如果 lch 为 0 则表示 fa 没有左儿子,rch同理)
输出描述:
输出一个整数表示最长链的长度。
示例1
输入
9 1
1 2 3 -3
2 4 5 3
4 0 0 1
5 8 9 0
8 0 0 1
9 0 0 6
3 6 7 -9
6 0 0 2
7 0 0 1
6
输出
4
解法一:类似找最长子数组
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
TreeNode root = createTree(br);
int sum = Integer.parseInt(br.readLine());
int res = findMaxLength(root,sum);
System.out.println(res);
}
public static int findMaxLength(TreeNode root,int num){
if(root==null) return 0;
HashMap<Integer,Integer> map = new HashMap<>();
map.put(0,0);
return find(root,num,0,1,0,map);
}
public static int find(TreeNode root,int num,int presize,int level,int maxsize,HashMap<Integer,Integer> map){
if(root==null) return maxsize;
int size = presize+root.val;
if(!map.containsKey(size)){
map.put(size,level);
}
if(map.containsKey(size-num)){
maxsize = Math.max(maxsize,level-map.get(size-num));
}
maxsize = find(root.left,num,size,level+1,maxsize,map);
maxsize = find(root.right,num,size,level+1,maxsize,map);
if(map.get(size)==level){
map.remove(size);
}
return maxsize;
}
//递归建树
public static TreeNode createTree(BufferedReader br){
try{
String[] ss = br.readLine().trim().split(" ");
int data = Integer.parseInt(ss[3]);
int left = Integer.parseInt(ss[1]);
int right = Integer.parseInt(ss[2]);
TreeNode root = new TreeNode(data);
if(left!=0){
root.left = createTree(br);
}
if(right!=0){
root.right = createTree(br);
}
return root;
}catch(Exception e){
return null;
}
}
}
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val = val;
}
}