/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ class Solution { // 智源研究院 一面 coding 出道 当时没想起来 后序遍历 public: unordered_map<TreeNode*, int> dpy; // 记录选择当前节点的最大收获 unordered_map<TreeNode*, int> dpn; // 记录不选择当前节点的最大收获 /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param root TreeNode类 * @return int整型 */ void postorder(TreeNode* root) { if(root==nullptr) { return; } // 先遍历左子 postorder(root->left); // 右子 postorder(root->right); // 当前结点 dpy[root] = root->val + dpn[root->left] + dpn[root->right]; // 计算选择当前节点 = 当前的值 + 不选左右子结点的两个值 // 不选择当前节点 max(选左, 不选左) + max(选右, 不选右) dpn[root] = max(dpy[root->left] , dpn[root->left]) + max(dpy[root->right] ,dpn[root->right]); } // 后序遍历 左子 右子 本 + 动态规划 int rob(TreeNode* root) { // write code here postorder(root); return max(dpy[root], dpn[root]); } };