题解 | #在二叉树中找到累加和为指定值的最长路径长度#

在二叉树中找到累加和为指定值的最长路径长度

http://www.nowcoder.com/practice/2d35bc3364e3470381bc4eebd9178747

import java.io.*;
import java.util.*;
public class Main {

    static class Node{
        int value;
        Node left;
        Node right;

        public Node(int value) {
            this.value = value;
        }
        public Node(){

        }
    }

    public static int countLongest (Node head, int k) {
        //key表示某个累加和,value表示这个累加和在路径中最早出现层数
        HashMap<Integer, Integer> map = new HashMap<>();
        //表示不用包括任何节点就可以得到累加和为0
        map.put(0,0);
        return preOrder (head, k, map, 0, 1, 0);
    }

    public static int preOrder (Node head, int k, HashMap<Integer, Integer> map, int preSum, int level, int maxLen) {
        if (head == null) {
            return maxLen;
        }
        int curSum = preSum + head.value;
        if (!map.containsKey(curSum))
            map.put(curSum, level);
        if (map.containsKey(curSum-k)) {
            maxLen = Math.max(maxLen, level - map.get(curSum-k));
        }
        maxLen = preOrder(head.left, k, map, curSum, level + 1, maxLen);
        maxLen = preOrder(head.right, k, map, curSum, level + 1, maxLen);
        //跑到头来说明已经把一条能检测的路走到头了,此时该走另外一条路了,若不删除当前
        //新加进map里去的curSum和level,万一下一条路径有某个curSum-k恰好等于当前curSum
        //会误以为他们在同一条路径上,造成结果有误
        if (level == map.get(curSum))
            map.remove(curSum);
        return maxLen;
    }



    public static void main(String[] args) {
        HashMap<Integer,Node> map = new HashMap<Integer,Node>() ;
        Scanner in = new Scanner(System.in);

        String[] input = in.nextLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int rootID=Integer.parseInt(input[1]);
        Node root=new Node();
        map.put(rootID,root);   //root中暂且没有添加值

        for (int i = 0; i < n; i++) {
            //build the binary tree
            String[] nodes = in.nextLine().split(" ");
            int nodeID = Integer.parseInt(nodes[0]);
            int leftID = Integer.parseInt(nodes[1]);
            int rightID = Integer.parseInt(nodes[2]);
            int value=Integer.parseInt(nodes[3]);

            //遍历Map并添加ID,node
            if(map.containsKey(nodeID)){
                Node tempNode=map.get(nodeID);
                tempNode.value=value;   //添加node的值

                //添加左右节点
                Node leftNode = leftID == 0 ? null : new Node();
                Node rightNode = rightID == 0 ? null : new Node();
                tempNode.left = leftNode;
                tempNode.right = rightNode;

                //左右放入map
                if(leftID!=0){
                    map.put(leftID,leftNode);
                }
                if(rightID!=0){
                    map.put(rightID,rightNode);
                }
            }

        }

        int num=Integer.parseInt(in.nextLine());
        int result=countLongest (root,num);
        System.out.println(result);

    }
}
全部评论

相关推荐

11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
评论
2
1
分享
牛客网
牛客企业服务