题目
间隔遍历求值最大
讲解视频
https://www.bilibili.com/video/BV16E41187TP?from=search&seid=2318345313049362035
思路
每一个节点分成两种情况
- doRob
- notRob
这两个状态用两个HashMap来实现, value表示能够偷取的最大金额
Map<TreeNode,Integer> doRob= new HashMap<>();
Map<TreeNode,Integer> not Rob= new HashMap<>();
后序遍历整棵树,遍历的时候put()
更新map的值,getOrDefault()
获取节点的值
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<TreeNode, Integer> doRob = new HashMap<>();
Map<TreeNode, Integer> notRob = new HashMap<>();
public int rob(TreeNode root){
dfs(root);
return Math.max(doRob.getOrDefault(root, 0), notRob.getOrDefault(root, 0));
}
public void dfs(TreeNode root){
if(root == null){
return;
}
dfs(root.left);
dfs(root.right);
//rob
doRob.put(root, root.val + notRob.getOrDefault(root.left, 0) + notRob.getOrDefault(root.right, 0));
//not rob
notRob.put(root, Math.max(doRob.getOrDefault(root.left, 0), notRob.getOrDefault(root.left, 0)) + Math.max(doRob.getOrDefault(root.right, 0), notRob.getOrDefault(root.right, 0)));//根节点不偷,比较左右子树偷与不偷的更大值
}
}
map的getOrDefault()
的用法举例
import java.util.HashMap;
import java.util.Map;
public class mapTest {
public static void main(String[] args) {
Map<String, String> map= new HashMap<>();
map.put("张三", "男");
map.put("李四", "女");
map.put("王五", "男");
String query1 = map.getOrDefault("张三", "无此人");
String query2 = map.getOrDefault("周六", "无此人");
System.out.println("张三的性别是"+query1+"\n周六的性别是"+query2);
}
}
运行结果
张三的性别是男
周六的性别是无此人