#include <bits/stdc++.h>
#include <unordered_set>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void dfs(TreeNode* node, unordered_set<TreeNode*>& visited) {
if (!node || node->val == 0 || visited.count(node)) return;
visited.insert(node);
dfs(node->left, visited);
dfs(node->right, visited);
}
int countIslands(TreeNode* root) {
if (!root) return 0;
unordered_set<TreeNode*> visited;
int islandCount = 0;
function<void(TreeNode*)> traverse = [&](TreeNode* node) {
if (!node) return;
if (node->val == 1 && !visited.count(node)) {
islandCount++;
dfs(node, visited);
}
traverse(node->left);
traverse(node->right);
};
traverse(root);
return islandCount;
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(0);
root->right = new TreeNode(1);
root->right->left = new TreeNode(1);
root->right->right = new TreeNode(0);
cout << "Number of islands: " << countIslands(root) << endl; // Output: 2
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBUcmVlTm9kZSB7CiAgICBpbnQgdmFsOwogICAgVHJlZU5vZGUgKmxlZnQ7CiAgICBUcmVlTm9kZSAqcmlnaHQ7CiAgICBUcmVlTm9kZShpbnQgeCkgOiB2YWwoeCksIGxlZnQoTlVMTCksIHJpZ2h0KE5VTEwpIHt9Cn07Cgp2b2lkIGRmcyhUcmVlTm9kZSogbm9kZSwgdW5vcmRlcmVkX3NldDxUcmVlTm9kZSo+JiB2aXNpdGVkKSB7CiAgICBpZiAoIW5vZGUgfHwgbm9kZS0+dmFsID09IDAgfHwgdmlzaXRlZC5jb3VudChub2RlKSkgcmV0dXJuOwogICAKICAgIHZpc2l0ZWQuaW5zZXJ0KG5vZGUpOwoKICAgIGRmcyhub2RlLT5sZWZ0LCB2aXNpdGVkKTsKICAgIGRmcyhub2RlLT5yaWdodCwgdmlzaXRlZCk7Cn0KCmludCBjb3VudElzbGFuZHMoVHJlZU5vZGUqIHJvb3QpIHsKICAgIGlmICghcm9vdCkgcmV0dXJuIDA7CiAgIAogICAgdW5vcmRlcmVkX3NldDxUcmVlTm9kZSo+IHZpc2l0ZWQ7CiAgICBpbnQgaXNsYW5kQ291bnQgPSAwOwoKICAgIGZ1bmN0aW9uPHZvaWQoVHJlZU5vZGUqKT4gdHJhdmVyc2UgPSBbJl0oVHJlZU5vZGUqIG5vZGUpIHsKICAgICAgICBpZiAoIW5vZGUpIHJldHVybjsKICAgICAgICBpZiAobm9kZS0+dmFsID09IDEgJiYgIXZpc2l0ZWQuY291bnQobm9kZSkpIHsKICAgICAgICAgICAgaXNsYW5kQ291bnQrKzsKICAgICAgICAgICAgZGZzKG5vZGUsIHZpc2l0ZWQpOwogICAgICAgIH0KICAgICAgICB0cmF2ZXJzZShub2RlLT5sZWZ0KTsKICAgICAgICB0cmF2ZXJzZShub2RlLT5yaWdodCk7CiAgICB9OwoKICAgIHRyYXZlcnNlKHJvb3QpOwogICAgcmV0dXJuIGlzbGFuZENvdW50Owp9CgppbnQgbWFpbigpIHsKICAgIFRyZWVOb2RlKiByb290ID0gbmV3IFRyZWVOb2RlKDEpOwogICAgcm9vdC0+bGVmdCA9IG5ldyBUcmVlTm9kZSgwKTsKICAgIHJvb3QtPnJpZ2h0ID0gbmV3IFRyZWVOb2RlKDEpOwogICAgcm9vdC0+cmlnaHQtPmxlZnQgPSBuZXcgVHJlZU5vZGUoMSk7CiAgICByb290LT5yaWdodC0+cmlnaHQgPSBuZXcgVHJlZU5vZGUoMCk7CiAgIAogICAgY291dCA8PCAiTnVtYmVyIG9mIGlzbGFuZHM6ICIgPDwgY291bnRJc2xhbmRzKHJvb3QpIDw8IGVuZGw7IC8vIE91dHB1dDogMgoKICAgIHJldHVybiAwOwp9Cg==