题目:
给定的一颗多叉树代表员工的上下级关系,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 当我不来的时候,我的下级有两种选择,来或不来,取最大值