[程序员代码面试指南]二叉树问题-派对的最大快乐值

题意

一棵多叉树代表员工的上下级关系,孩子节点是父节点的直接下级。节点代表员工,属性包括快乐值和孩子节点列表。
大家参加了party,要求一个员工去了则它的所有直接下级都不能去,问参加party能得到的最大快乐值是多少。

题解

  • 我原本的思路是一层员工去不去是它上面一层去和不去两种状态转移过来的,但是也注意一层的员工可以有的去有的不去,所以应该按节点看。
  • 按节点看状态,分根节点去和不去讨论快乐值最大值怎么由所有孩子节点转移来,递归是从下得到上的,叶子节点很好初始化。
  • 并且一个节点自己去不去的两种返回值放在一个类对象里返回,也可以拆开写两种函数
  • 思路比较重要,代码比较好写。

代码

package Tree;

import java.util.ArrayList;

class Employee{
    int happyVal;
    ArrayList<Employee> list=new ArrayList<>();
    public Employee(int happyVal,ArrayList<Employee> list) {
        this.happyVal=happyVal;
        this.list=list;
    }
}

class HappyReturnType{
    int withoutRoot;
    int withRoot;
    public HappyReturnType(int withoutRoot,int withRoot) {
        this.withoutRoot=withoutRoot;
        this.withRoot=withRoot;
    }
}

public class Main {
    public static void main(String args[]) {
        //test
        Employee e1=new Employee(100,null);//level3

        ArrayList<Employee> e2ChildList=new ArrayList<Employee>();
        e2ChildList.add(e1);
        Employee e2=new Employee(500,e2ChildList);//level2

        Employee e3=new Employee(400,null);//level2

        ArrayList<Employee> e4ChildList=new ArrayList<Employee>();
        e4ChildList.add(e2);
        e4ChildList.add(e3);
        Employee e4=new Employee(200,e4ChildList);//level1

        //compute
        HappyReturnType r=maxHappyVal(e4);
        int maxHappyVal=Math.max(r.withoutRoot, r.withRoot);
        System.out.println(maxHappyVal);
    }

    public static HappyReturnType maxHappyVal(Employee node) {
        int withoutRoot=0;
        int withRoot=node.happyVal;

        if(node.list==null) {
            return new HappyReturnType(0,node.happyVal);
        }

        for(Employee childNode:node.list) {
            HappyReturnType r=maxHappyVal(childNode);
            int happyVal=Math.max(r.withoutRoot,r.withRoot);
            withoutRoot+=happyVal;

            withRoot+=r.withoutRoot;
        }
        return new HappyReturnType(withoutRoot,withRoot);
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/11080111.html

时间: 2024-11-02 18:53:30

[程序员代码面试指南]二叉树问题-派对的最大快乐值的相关文章

[程序员代码面试指南]二叉树问题-计算完全二叉树节点数

题意 计算完全二叉树节点数. 题解 不使用遍历方法,优化时间复杂度到O(H^2). 高度为h的满二叉树节点数为2^h-1. 设计递归函数search(Node root,int h,int H),返回当前节点roo为根的完全二叉树的节点数.h代表该节点在的高度,高度从1计算,H代表原始二叉树的高度始终不变. t判断当前节点的右子树的最左边的节点的高度. -若和该树的高度一致,则说明左子树为满二叉树,节点数=由上式得到的左子树节点数+本节点数1+递归得到的右子树节点数. 若高度不一致,则说明右子树

[程序员代码面试指南]二叉树问题-找到二叉树中两节点最近公共祖先

题解 法一:后序遍历.搞清返回值逻辑. todo 更新别的方法 法一代码 public class Parent { public static void main(String args[]) { Node n1=new Node(1); Node n2=new Node(2); Node n3=new Node(3); Node n4=new Node(4); n1.left=n2; n1.right=n3; n3.left=n4; System.out.print(firstParent(

[程序员代码面试指南]二叉树问题-树1是否包含树2的拓扑结构

题解 先序遍历树1,判断树1以每个节点为根的子树是否包含树2的拓扑结构. 时间复杂度:O(M*N) 注意区分判断总体包含关系.和判断子树是否包含树2的函数. 代码 public class Main { public static void main(String args[]) { //test Node n1=new Node(1); Node n2=new Node(2); Node n3=new Node(3); Node n4=new Node(4); n1.left=n2; n1.r

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

左神算法书籍《程序员代码面试指南》——2_12将搜索二叉树转换成双向链表

对二叉树的节点来说,有本身的值域,有指向左孩子和右孩子的两个指针:对双向链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针.在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表. 1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 struct treeNode 5 { 6 int v; 7 treeNode *l, *r; 8 treeNode(int a =

左神算法书籍《程序员代码面试指南》——3_02打印二叉树的边界节点【★★】

[题目]给定一棵二叉树的头节点head,按照如下两种标准分别实现二叉树边界节点的逆时针打印.标准一:1.头节点为边界节点.2.叶节点为边界节点.3.如果节点在其所在的层中是最左或最右的,那么也是边界革点.标准二:1.头节点为边界节点.2.叶节点为边界节点.3.树左边界延伸下去的路径为边界节点.4.树右边界延伸下去的路径为边界节点.例如,如图3 - 2所示的树. 按标准一的打印结果为:1,2,4,7,11,13,14,15,16,12,10,6,3按标准二的打印结果为:1,2,4,7,13,14,

左神算法书籍《程序员代码面试指南》——3_08找到二叉树中符合搜索二又树条件的最大拓扑结构【***】

[题目]给定一棵二叉树的头节点head,已知所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小. [题解] 方法一:二叉树的节点数为N,时间复杂度为O(N2)的方法. 首先来看这样一个问题,以节点h为头的树中,在拓扑结构中也必须以h为头的情况下,怎么找到符合搜索二叉树条件的最大结构?这个问题有一种比较容易理解的解法,我们先考查h的孩子节点,根据孩子节点的值从h开始按照二叉搜索的方式移动,如果最后能移动到同一个孩子节点上,说明这个孩子节点可以作为这个拓扑的一部分,并继续考

《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动90

题目 将正方形矩阵顺时针转动90 java代码 package com.lizhouwei.chapter8; /** * @Description: 将正方形矩阵顺时针转动90 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:16 * @Modify by: * @ModifyDate: */ public class Chapter8_2 { public void rotate(int[][] matrix) { int tR = 0; i

《程序员代码面试指南》第八章 数组和矩阵问题 需要排序的最短子数组长度

题目 需要排序的最短子数组长度 java代码 package com.lizhouwei.chapter8; /** * @Description: 需要排序的最短子数组长度 * @Author: lizhouwei * @CreateDate: 2018/4/29 8:03 * @Modify by: * @ModifyDate: */ public class Chapter8_5 { public int getMinLength(int[] arr) { if (arr == null