The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the “root.” Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that “all houses in this place forms a binary tree”. It will automatically contact the police if two directly-linked houses were broken into on the same night. Determine the maximum amount of money the thief can rob tonight without alerting the police.
Example:
3 / 2 3 \ \ 3 1
Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.
3 / 4 5 / \ \ 1 3 1
Maximum amount of money the thief can rob = 4 + 5 = 9.
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * } */ classSolution { public: /** * @param root: The root of binary tree. * @return: The maximum amount of money you can rob tonight */ inthouseRobber3(TreeNode* root){ // write your code here unordered_map<TreeNode*, int> m; return dfs(root, m); } intdfs(TreeNode *root, unordered_map<TreeNode*, int> &m){ if (root == nullptr) return0; if (m.count(root)) return m[root]; int val = 0; if (root->left) { val += dfs(root->left->left, m) + dfs(root->left->right, m); } if (root->right) { val += dfs(root->right->left, m) + dfs(root->right->right, m); } val = max(val + root->val, dfs(root->left, m) + dfs(root->right, m)); m[root] = val; return val; } };