程序员代码面试指南刷题--第三章.在二叉树中找到累加和为指定值的最长路径长度

题目描述
给定一颗二叉树和一个整数 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;
    }
}
发布了189 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44406146/article/details/105481732