算法58-员工最大快乐值(多叉树)

题目:

给定的一颗多叉树代表员工的上下级关系,value代表员工带来的快乐值
在这里插入图片描述

直接上下级不能同时来,root来了下一级就不能来,求如何发请帖,使来到人达到最大的快乐值

分析:

需要下层返回的信息:

type Info struct{
	yes int//l来的快乐值
	no int//不来的快乐值
}

basecase:

	if len(x.subnode)==0{
		info:=Info{yes:x.Value,no:0}
		return info
	}

当前节点,没有下级,来就加上快乐值,不来就不加

代码:

package main
import (
	"fmt"
	"math"

)
type TreeNode struct {
	Value int
    // 左子树指针
    subnode []*TreeNode
    // 右子树指针
    // right *TreeNode
}
type Info struct{
	yes int
	no int
}
func process(x TreeNode)Info{
	//base case来就算上值  不来就不算值
	if x.subnode==nil{
		info:=Info{yes:x.Value,no:0}
		return info
	}
	// var tmp int
	var info Info

	var nextinfo Info
	for i:=0;i<len(x.subnode);i++{//遍历我的每一个下属
		nextinfo=process(*(x.subnode[i]))//返回给我来或不来两个信<
		//我不来我的下级就可以选择来或者不来,返回最大的选择
		fmt.Printf("xiaji    %v    %v\n",*(x.subnode[i]),nextinfo)
		info.no+=int(math.Max(float64(nextinfo.yes),float64(nextinfo.no)))
		//我来我的下级就不能来,我的值加上我下级不来的值
		info.yes=nextinfo.no+x.Value
	}
	// mt.Println(count)

	return info
}


func main(){
    // 根节点
	var root TreeNode
	root.Value=18

    // 一级左子树
	var left1 TreeNode
	left1.Value=8
    root.subnode = append(root.subnode ,&left1)
    
    // 一级右子树
	var right1 TreeNode
	right1.Value=17
    root.subnode =append(root.subnode ,&right1)
    
       // 一级右子树
	var rootsub TreeNode
	rootsub.Value=50
    root.subnode =append(root.subnode ,&rootsub)

	// 二级左子树
    var left2 TreeNode
    left2.Value=5
    left1.subnode = append(left1.subnode,&left2)

	// 三级右子树
	var left3 TreeNode
    left3.Value=4
    right1.subnode =append(right1.subnode , &left3)

	//四级右子树
	var left4 TreeNode
    left4.Value=12
    right1.subnode =append(right1.subnode, &left4)

	//五级右子树
	var left5 TreeNode
	left5.Value=15
	rootsub.subnode = append(rootsub.subnode,&left5)
	fmt.Println(root.subnode)
	fmt.Println(len(root.subnode))

	fmt.Println(process(root))
}

结果:

PS C:\Mygo\src\wangzhoufengtest\algoeithm\maxhappy_58> go run .\maxhappy.go
[0xc0000223e0 0xc000022400 0xc000022420]
3
xiaji    {5 []}    {5 0}
xiaji    {8 [0xc000022460]}    {8 5}
xiaji    {4 []}    {4 0}
xiaji    {12 []}    {12 0}
xiaji    {17 [0xc000022480 0xc0000224a0]}    {17 16}
xiaji    {15 []}    {15 0}
xiaji    {50 [0xc0000224c0]}    {50 15}
{33 75}
PS C:\Mygo\src\wangzhoufengtest\algoeithm\maxhappy_58> 

总结:

1 basecase很明确,没有下级,来就加上我的值,不来就不加
2 当我不来的时候,我的下级有两种选择,来或不来,取最大值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值