最多宝藏

本文最后更新于:2024年3月18日 凌晨

最多宝藏

问题描述

  • 寻宝队来到了埋藏宝藏的山洞入口,根据藏宝图显示,山洞中的藏宝室按照二叉树的形式分布,除与山洞入口相连的root藏宝室外,每个藏宝室有且只有一个"父’藏宝室相联,藏宝室之问被安装了特殊监控装置,如果拿了两个直接相联的藏宝室的宝物或者拿了root藏宝室的宝物,藏宝洞的大门将会永远关闭,给定二叉树的root,返回寻宝队可以成功从藏宝洞中最多取出的宝物数量。
image-20220328204439406

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class Solution {

// 记录已经添加的节点。
List<TreeNode> added = new ArrayList<>();

public static void main(String[] args) {
TreeNode n1 = new TreeNode(5);
TreeNode n2 = new TreeNode(2);
TreeNode n3 = new TreeNode(5);
TreeNode n4 = new TreeNode(2);
TreeNode n5 = new TreeNode(2);
TreeNode n6 = new TreeNode(4);
TreeNode n7 = new TreeNode(1);
n1.left = n2;
n1.right = n3;
n2.left = n4;
n3.left = n5;
n3.right = n6;
n4.left = n7;
System.out.println(new Solution().Treasurehunt(n1));
}

/**
* 代码中的类名,方法名,参数名已经指定,请勿修改,直接返回方法规定的值即可。
*
* @param root TreeNode类。
* @return int整型。
*/
public int Treasurehunt(TreeNode root) {
return dfs(root, null);
}

public Integer dfs(TreeNode root, TreeNode parent) {
// 如果该节点不存在,宝藏价值为0
if (root == null) {
return 0;
}
// 记录当前节点的最大宝藏价值。
int curr = 0;
// 如果当前节点的父节点没有被加入且该节点不是根结点,则尝试加入当前节点的宝藏。
if (!added.contains(parent) && parent != null) {
added.add(root);
int left = dfs(root.left, root);
int right = dfs(root.right, root);
// 保存结果,当前节点下最大宝藏金额 = 左子节点的最大宝藏金额 + 右子节点的最大宝藏金额 + 本节点宝藏金额。
curr = left + right + root.val;
// 回溯。
added.remove(root);
}
// 不加入当前节点。
int left = dfs(root.left, root);
int right = dfs(root.right, root);
// 返回两种方式的最大值。
return Math.max(left + right, curr);
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!