题意:
给定一棵二叉树,不能偷窃相邻的节点,问最大偷窃金额是多少?
方法一:
动态规划
思路:动态规划。
状态转移方程:
首先,mp1,mp2分别表示当前节点偷或不偷的最大金额;后序遍历+动态规划得到每个节点的偷或不偷的最大金额。
class Solution {
public:
unordered_map<TreeNode*,int> mp1,mp2;//mp1,mp2分别表示当前节点偷或不偷的最大金额
int rob(TreeNode* root) {
f(root);//递归
return max(mp1[root],mp2[root]);//返回最大值
}
void f(TreeNode* root){//递归
if(root==nullptr)
return;
f(root->left);//左递归
f(root->right);//右递归
mp1[root]=root->val+mp2[root->left]+mp2[root->right];//当前节点偷
mp2[root]=max(mp1[root->left],mp2[root->left])+max(mp1[root->right],mp2[root->right]);//当前节点不偷
}
};
时间复杂度:
空间复杂度:![]()
方法二:
java
思路:状态转移方程:
![]()
import java.util.*;
public class Solution {
//mp1,mp2分别表示当前节点偷或不偷的最大金额
HashMap<TreeNode,Integer> mp1=new HashMap();
HashMap<TreeNode,Integer> mp2=new HashMap();
public int rob (TreeNode root) {
mp1.put(null,0);
mp2.put(null,0);
f(root);//递归
return Math.max(mp1.get(root),mp2.get(root));//返回最大值
}
void f(TreeNode root){//递归
if(root==null)
return;
f(root.left);//左递归
f(root.right);//右递归
mp1.put(root,root.val+mp2.get(root.left)+mp2.get(root.right));//当前节点偷
mp2.put(root,Math.max(mp1.get(root.left),mp2.get(root.left))+Math.max(mp1.get(root.right),mp2.get(root.right)));//当前节点不偷
}
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号