LeetCode 337. House Robber III 打家劫舍

第一次用结构体代替dp数组,这个题没有标明树的深度,用数组存二叉树会爆内存。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
struct dp{
    int v0,v1;
    dp *lf;
    dp *rt;
    dp() : v0(0),v1(0),lf(NULL),rt(NULL){}
};

class Solution {
public:
    void dfs(TreeNode *p,dp *u){
        if(!p){
            return;
        }
        if(!p->left&&!p->right){
            u->v0=0;
            u->v1=p->val;
            return ;
        }
        u->lf=new dp(),u->rt=new dp();
        if(p->left){
            dfs(p->left,u->lf);
        }
        if(p->right){
            dfs(p->right,u->rt);
        }
        /*
        dp[1][u]=dp[0][L(u)]+dp[0][R(u)]+p->val;
        dp[0][u]=max(dp[0][L(u)],dp[1][L(u)])+max(dp[0][R(u)],dp[1][R(u)]);
        */
        u->v1=p->val+u->lf->v0+u->rt->v0;
        u->v0=max(u->lf->v0,u->lf->v1)+max(u->rt->v0,u->rt->v1);
    }
    int rob(TreeNode* root) {
        dp *ans=new dp();
        dfs(root,ans);
        return max(ans->v0,ans->v1);
    }
};