LeetCode 337. House Robber III
DFS,给每个结点增加一个两元素的数组。res[0] 表示不加上当前结点值的最大值,res[1] 表示加上当前结点值的最大值。那么对于 res[0] 来说,其值等于子结点数组元素的较大值,因为此时可以加上子结点,也可以不加上子结点,选其中较大值。但是对于 res[1] 来说,就不行了,因为加上当前结点值的时候,必须不能加上子结点的值,否则警报会响,因此,只能算上子结点的 res[0]。
源码:
/** * 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: vector<int> dfs(TreeNode* root){ vector<int> res(2,0); if(!root)return res; if(root->left){ vector<int> temp = dfs(root->left); res[0] += max(temp[0], temp[1]); res[1] += temp[0]; } if(root->right){ vector<int> temp = dfs(root->right); res[0] += max(temp[0], temp[1]); res[1] += temp[0]; } res[1] += root->val; return res; } int rob(TreeNode* root) { if(!root)return 0; vector<int> temp = dfs(root); return max(temp[0], temp[1]); } };