题意:
        给定一棵二叉树,不能偷窃相邻的节点,问最大偷窃金额是多少?        


方法一:
动态规划

思路:
        动态规划。
        状态转移方程:
            
        首先,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)));//当前节点不偷
    }
}

时间复杂度:
空间复杂度: