最开始理解题目错了,下意识认为是求奇偶层之间的最大值,写出来通过了一半样例,才反映过来不连续层不代表就是隔一层。。
重新思考思路,采用递归思想,对每一节点r来说,其最大值要么是r和r的孙子们的值, 要么是r的儿子们的值,深度搜索解决
class Solution
{
public:
int rob(TreeNode *root)
{
int left = 0, right = 0;
return dfs(root, left, right);
}
int dfs(TreeNode *node, int &left, int &right)
{
if (node == nullptr)
return 0;
int ll = 0, lr = 0, rl = 0, rr = 0;
left = dfs(node->left, ll, lr);
right = dfs(node->right, rl, rr);
return max(node->val + ll + lr + rr + rl, left + right);
}
};
DP求解以及思路,分析的非常好,值得一看