LeetCode HOT100 - 打家劫舍 III

树形dp

类似的形式,只是这次放到了树上,或者说,和它相邻的前驱节点的个数增加了

我们仍然是考虑每个节点选还是不选

如果选,那么子节点一定不选

如果不选,那么子节点是可以选也可以不选

树的话就不妨显式的 dp 数组,用 dfs 回传的信息作为子节点的信息,并据此来计算当前节点的情况

/**
 * 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) {
        auto dfs = [&](auto self, TreeNode* x) -> pair<int, int> {
            if (!x) {
                return {0, 0};
            }
            auto l = self(self, x->left);
            auto r = self(self, x->right);
            return {max(l.first, l.second) + max(r.first, r.second), x->val + l.first + r.first};
        };
        auto ans = dfs(dfs, root);
        return max(ans.first, ans.second);
    }
};
posted @ 2026-03-30 23:57  rdcamelot  阅读(20)  评论(0)    收藏  举报