最多宝藏
本文最后更新于:2024年3月18日 凌晨
最多宝藏
问题描述
- 寻宝队来到了埋藏宝藏的山洞入口,根据藏宝图显示,山洞中的藏宝室按照二叉树的形式分布,除与山洞入口相连的root藏宝室外,每个藏宝室有且只有一个"父’藏宝室相联,藏宝室之问被安装了特殊监控装置,如果拿了两个直接相联的藏宝室的宝物或者拿了root藏宝室的宝物,藏宝洞的大门将会永远关闭,给定二叉树的root,返回寻宝队可以成功从藏宝洞中最多取出的宝物数量。
代码实现
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)); }
public int Treasurehunt(TreeNode root) { return dfs(root, null); }
public Integer dfs(TreeNode root, TreeNode parent) { 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); } }
|