示例代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int rob(TreeNode* root) {
        vector<int> result=robTree(root);
        return max(result[0],result[1]);
    }

    //长度为2的数组 0:不偷 1:偷
    vector<int> robTree(TreeNode* cur){
        if(!cur){
            return vector<int>{0,0};
        }
        vector<int> left=robTree(cur->left);
        vector<int> right=robTree(cur->right);
        //偷cur
        int val1=cur->val+left[0]+right[0];
        //不偷cur 那么可以偷也可以不偷左右节点,则取较大的情况(与非树状的区别)
        int val2=max(left[0],left[1])+max(right[0],right[1]);
        return {val2,val1};
    }
};

效果展示

LeetCode---337. 打家劫舍 III(树状DP)_算法