第三章 二叉树问题(派对的最大快乐值)

【题目】

        员工信息的定义如下:

public static class Employee {
    public int happy;// 这名员工可以带来的欢乐值
    public List<Employee> employeeList;// 这名员工有哪些直接下级
    public Employee(int happy, List<Employee> employeeList) {
        this.happy = happy;
        this.employeeList = employeeList;
    }
}

公司的每个员工都符合Employee类的描述。整个公司人员结构可以看作是一颗标准的,没有环的多叉树。树的头节点是公司的唯一的老板,除老板外,每个员工都有唯一的直接上级。叶节点是没有任何下属的基层员工,除基层员工外,每个员工都有一个或多个直接下级
,这个公司现在要办party,你可以决定那些员工来,哪些员工不来,但是要遵循如下规则:
1、如果某个员工来了,那么这个员工的所有直接下级都不能来
2、派对的整体快乐值是所有到场员工快乐值的累加
3、你的目标是让派对的整体快乐值最大
给定一个头节点boss,请返回派对的最大快乐值
要求:如果以boss为头节点的整棵树有N个节点,请做到时间复杂度为O(N)

public static ReturnType getPartyMaxHappy(Employee employee) {
        if (employee == null) {
            return new ReturnType(0, 0);
        }
        int yesMax = employee.happy;
        int noMax = 0;
        for (Employee employee1 : employee.employeeList) {
            ReturnType temp = getPartyMaxHappy(employee1);
            yesMax += temp.noMax;
            noMax+= Math.max(temp.yesMax,temp.noMax);
        }
        return new ReturnType(yesMax, noMax);
    }

    public static class ReturnType {

        public int yesMax;

        public int noMax;

        public ReturnType(int yesMax, int noMax) {
            this.yesMax = yesMax;
            this.noMax = noMax;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值