// In a tree of zeroes and ones , give the final answer as no.of islands can be formed .
// It forms an island where ones are connected and surrounded by zeroes .
// Bottom Up DFS (POSTORDER TRAVERSAL) : DP on Tree
// input will be only root of tree
// dp[i] is subtree rooted at node i will give no. of islands in subtree rooted at i
#include <iostream>
#include <unordered_map>
using namespace std;
class Node
{
public:
Node *right;
Node *left;
int data;
Node()
{
right = nullptr;
left = nullptr;
}
Node(int val)
{
right = nullptr;
left = nullptr;
data = val;
}
};
int getAns(Node *root, unordered_map<Node *, int> dp)
{
if (root == nullptr)
{
return 0;
}
if (!root->left && !root->right)
{
dp[root] = root->data;
return dp[root];
}
int leftTreeIslands = getAns(root->left, dp);
int rightTreeIslands = getAns(root->right, dp);
if (root->data == 0)
{
dp[root] = leftTreeIslands + rightTreeIslands;
}
else
{
if ((root->right && root->right->data) && (root->left && root->left->data))
{
dp[root] = leftTreeIslands + rightTreeIslands - 1;
}
else if ((root->right && root->right->data) && (root->left && root->left->data))
{
dp[root] = leftTreeIslands + rightTreeIslands;
}
else
{
dp[root] = leftTreeIslands + rightTreeIslands + 1;
}
}
return dp[root];
}
Node *createTree()
{
Node *root = new Node(0);
Node *l1 = new Node(1);
root->left = l1;
Node *r1 = new Node(0);
root->right = r1;
Node *l2 = new Node(1);
l1->left = l2;
Node *r2 = new Node(0);
l2->right = r2;
Node *r3 = new Node(1);
r1->right = r3;
return root;
}
int main()
{
unordered_map<Node *, int> dp;
Node *root = createTree();
int ans = getAns(root, dp);
cout << ans << endl;
return 0;
}
Ly8gSW4gYSB0cmVlIG9mIHplcm9lcyBhbmQgb25lcyAsIGdpdmUgdGhlIGZpbmFsIGFuc3dlciBhcyBuby5vZiBpc2xhbmRzIGNhbiBiZSBmb3JtZWQgLgovLyBJdCBmb3JtcyBhbiBpc2xhbmQgd2hlcmUgb25lcyBhcmUgY29ubmVjdGVkIGFuZCBzdXJyb3VuZGVkIGJ5IHplcm9lcyAuCi8vIEJvdHRvbSBVcCBERlMgKFBPU1RPUkRFUiBUUkFWRVJTQUwpIDogRFAgb24gVHJlZQovLyBpbnB1dCB3aWxsIGJlIG9ubHkgcm9vdCBvZiB0cmVlCi8vIGRwW2ldIGlzIHN1YnRyZWUgcm9vdGVkIGF0IG5vZGUgaSB3aWxsIGdpdmUgbm8uIG9mIGlzbGFuZHMgaW4gc3VidHJlZSByb290ZWQgYXQgaQoKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE5vZGUKewpwdWJsaWM6CiAgICBOb2RlICpyaWdodDsKICAgIE5vZGUgKmxlZnQ7CiAgICBpbnQgZGF0YTsKICAgIE5vZGUoKQogICAgewogICAgICAgIHJpZ2h0ID0gbnVsbHB0cjsKICAgICAgICBsZWZ0ID0gbnVsbHB0cjsKICAgIH0KICAgIE5vZGUoaW50IHZhbCkKICAgIHsKICAgICAgICByaWdodCA9IG51bGxwdHI7CiAgICAgICAgbGVmdCA9IG51bGxwdHI7CiAgICAgICAgZGF0YSA9IHZhbDsKICAgIH0KfTsKCmludCBnZXRBbnMoTm9kZSAqcm9vdCwgdW5vcmRlcmVkX21hcDxOb2RlICosIGludD4gZHApCnsKICAgIGlmIChyb290ID09IG51bGxwdHIpCiAgICB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKCFyb290LT5sZWZ0ICYmICFyb290LT5yaWdodCkKICAgIHsKICAgICAgICBkcFtyb290XSA9IHJvb3QtPmRhdGE7CiAgICAgICAgcmV0dXJuIGRwW3Jvb3RdOwogICAgfQoKICAgIGludCBsZWZ0VHJlZUlzbGFuZHMgPSBnZXRBbnMocm9vdC0+bGVmdCwgZHApOwogICAgaW50IHJpZ2h0VHJlZUlzbGFuZHMgPSBnZXRBbnMocm9vdC0+cmlnaHQsIGRwKTsKCiAgICBpZiAocm9vdC0+ZGF0YSA9PSAwKQogICAgewogICAgICAgIGRwW3Jvb3RdID0gbGVmdFRyZWVJc2xhbmRzICsgcmlnaHRUcmVlSXNsYW5kczsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoKHJvb3QtPnJpZ2h0ICYmIHJvb3QtPnJpZ2h0LT5kYXRhKSAmJiAocm9vdC0+bGVmdCAmJiByb290LT5sZWZ0LT5kYXRhKSkKICAgICAgICB7CiAgICAgICAgICAgIGRwW3Jvb3RdID0gbGVmdFRyZWVJc2xhbmRzICsgcmlnaHRUcmVlSXNsYW5kcyAtIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChyb290LT5yaWdodCAmJiByb290LT5yaWdodC0+ZGF0YSkgJiYgKHJvb3QtPmxlZnQgJiYgcm9vdC0+bGVmdC0+ZGF0YSkpCiAgICAgICAgewogICAgICAgICAgICBkcFtyb290XSA9IGxlZnRUcmVlSXNsYW5kcyArIHJpZ2h0VHJlZUlzbGFuZHM7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGRwW3Jvb3RdID0gbGVmdFRyZWVJc2xhbmRzICsgcmlnaHRUcmVlSXNsYW5kcyArIDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBkcFtyb290XTsKfQoKTm9kZSAqY3JlYXRlVHJlZSgpCnsKICAgIE5vZGUgKnJvb3QgPSBuZXcgTm9kZSgwKTsKICAgIE5vZGUgKmwxID0gbmV3IE5vZGUoMSk7CiAgICByb290LT5sZWZ0ID0gbDE7CiAgICBOb2RlICpyMSA9IG5ldyBOb2RlKDApOwogICAgcm9vdC0+cmlnaHQgPSByMTsKICAgIE5vZGUgKmwyID0gbmV3IE5vZGUoMSk7CiAgICBsMS0+bGVmdCA9IGwyOwogICAgTm9kZSAqcjIgPSBuZXcgTm9kZSgwKTsKICAgIGwyLT5yaWdodCA9IHIyOwogICAgTm9kZSAqcjMgPSBuZXcgTm9kZSgxKTsKICAgIHIxLT5yaWdodCA9IHIzOwogICAgcmV0dXJuIHJvb3Q7Cn0KCmludCBtYWluKCkKewogICAgdW5vcmRlcmVkX21hcDxOb2RlICosIGludD4gZHA7CiAgICBOb2RlICpyb290ID0gY3JlYXRlVHJlZSgpOwogICAgaW50IGFucyA9IGdldEFucyhyb290LCBkcCk7CiAgICBjb3V0IDw8IGFucyA8PCBlbmRsOwogICAgcmV0dXJuIDA7Cn0=