337. House Robber III

阳光穿透心脏的1/2处 2021-11-02 07:40 294阅读 0赞

一、题目

  1、审题 

  746986-20190630160050060-269074321.png

  2、分析

    给出一棵二叉树,取二叉树中的节点值,其中不能获取相邻层的二叉树节点。

二、解答

  1、思路

    方法一、

      分两种情况, 情况一: root.val + root.left.left.val + root.left.right.val + root.right.left.val + root.right.right.val

      情况二: root.left.val + root.right.val

      然后取这两种情况的最大值,进行递归!

  1. public int rob(TreeNode root) {
  2. if(root == null)
  3. return 0;
  4. int val = 0;
  5. if(root.left != null)
  6. val += rob(root.left.left) + rob(root.left.right);
  7. if(root.right != null)
  8. val += rob(root.right.left) + rob(root.right.right);
  9. return Math.max(val + root.val, rob(root.left) + rob(root.right));
  10. }

  

  方法二、

    由于方法一中,每一次递归有很多重复的计算。采用 Map 记录当前节点对应的最大值!减少递归的重复计算!

  1. public int rob(TreeNode root) {
  2. return robSub(root, new HashMap<TreeNode, Integer>());
  3. }
  4. private int robSub(TreeNode root, HashMap<TreeNode, Integer> map) {
  5. if(root == null)
  6. return 0;
  7. if(map.containsKey(root))
  8. return map.get(root);
  9. int val = 0;
  10. if(root.left != null)
  11. val += robSub(root.left.left, map) + robSub(root.left.right, map);
  12. if(root.right != null)
  13. val += robSub(root.right.left, map) + robSub(root.right.right, map);
  14. val = Math.max(val + root.val, robSub(root.left, map) + robSub(root.right, map));
  15. map.put(root, val);
  16. return val;
  17. }

  

转载于:https://www.cnblogs.com/skillking/p/11110254.html

发表评论

表情:
评论列表 (有 0 条评论,294人围观)

还没有评论,来说两句吧...

相关阅读