题意:每个节点都有一个值,不同时遍历父子节点的情况下,求整棵树遍历后的和的最大值。
分析:每个节点都是选或不选,取最优
(1)选:左右子节点不能选,孙子节点可以选也可以不选
(2)不选:左右子节点可以选也可以不选
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: map<TreeNode*, int> mp; int rob(TreeNode* root) { if(mp[root]) return mp[root]; if(root == NULL) return 0; int not_choose_root = rob(root -> left) + rob(root -> right); int choose_root = root -> val; if(root -> left != NULL){ choose_root += rob(root -> left -> left) + rob(root -> left -> right); } if(root -> right != NULL){ choose_root += rob(root -> right -> left) + rob(root -> right -> right); } return mp[root] = max(not_choose_root, choose_root); } };