- Related Questions & Answers
- How to keep house cool during summer without using ACs and coolers?
- How to keep lizards away from your house?
- What is the difference between home and house?
- What are some tips to decorate a wedding house?
- What safety measures should be adopted by girls who live alone in an independent house?
- How can a lady prepare the budget for her house in order to save more?
- Does vastu really effects the people living in the house?

- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who

Suppose one thief has found himself a new place for his thievery again. There is only one entrance to this area, the entrance is called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief felt that "all houses in this place forms a binary tree". And It will automatically contact the police if two directly-linked houses were broken into on the same night. We have to find the maximum amount of money the thief can rob tonight without alerting the police. So if the tree is like −

Then the output will be 7.

To solve this, we will follow these steps −

Define a method called solve(), this will take the node

if node is null, then return a pair (-infinity, 0)

leftVal := left of node, rightVal := right of node

first element of leftVal := maximum of first element of leftVal and 0

second element of leftVal := maximum of second element of leftVal and 0

first element of rightVal := maximum of first element of rightVal and 0

second element of rightVal := maximum of second element of rightVal and 0

currVal := max of value of node and 0

cantBeAdded := currVal + second value of leftVal + second value of rightVal

canBeAdded := max of (first value of leftVal + first value of rightVal) and maximum of (second value of leftVal, second value of rightVal, second value of leftVal + second value of rightVal, second value of leftVal + first value of rightVal, second value of rightVal + first value of leftVal)

Return a pair (cantBeAdded, canBeAdded)

In the main method, make a := solve(root), then return max of first value of a and second value of a.

Let us see the following implementation to get better understanding −

const int INF = -1e8; class Solution { public: void printData(pair t){ cout << t.first << " " << t.second << endl; } pair <int,int> solve(TreeNode* node){ if(!node){ return {INF,0}; } pair <int,int> leftVal = solve(node->left); pair <int,int> rightVal = solve(node->right); leftVal.first = max(leftVal.first,0); leftVal.second = max(leftVal.second,0); rightVal.second = max(rightVal.second,0); rightVal.first = max(rightVal.first,0); int currentVal = max(node->val,0); int cantBeAdded = currentVal + leftVal.second + rightVal.second; int canBeAdded =max(leftVal.first + rightVal.first,max({ leftVal.second,rightVal.second,leftVal.second + rightVal.second,leftVal.second+rightVal.first,rightVal.second+leftVal.first})); return {cantBeAdded,canBeAdded }; } int rob(TreeNode* root) { pair <int,int> a = solve(root); return max(a.first,a.second); } };

[3,2,3,null,3,null,1]

7

Advertisements