993. Cousins in Binary Tree
Input: root = [1,2,3,4], x = 4, y = 3
Output: falseInput: root = [1,2,3,null,4,null,5], x = 5, y = 4
Output: true
Last updated
Input: root = [1,2,3,4], x = 4, y = 3
Output: falseInput: root = [1,2,3,null,4,null,5], x = 5, y = 4
Output: true
Last updated
Input: root = [1,2,3,null,4], x = 2, y = 3
Output: false// Recursion (Preorder Traversal)
void helper(TreeNode* node, int x, int y, int depth, TreeNode* parent, TreeNode*& x_parent, TreeNode*& y_parent, int& x_depth, int& y_depth) {
if (!node) return;
if (node->val == x) {
x_parent = parent;
x_depth = depth;
} else if (node->val == y) {
y_parent = parent;
y_depth = depth;
} else { // once x or y is found, there is no need to go deeper
helper(node->left, x, y, depth + 1, node, x_parent, y_parent, x_depth, y_depth);
helper(node->right, x, y, depth + 1, node, x_parent, y_parent, x_depth, y_depth);
}
}
bool isCousins(TreeNode* root, int x, int y) { // time: O(n); space: O(n)
TreeNode *x_parent = nullptr, *y_parent = nullptr;
int x_depth = -1, y_depth = -1;
helper(root, x, y, 0, nullptr, x_parent, y_parent, x_depth, y_depth);
return (x_depth == y_depth && x_parent != y_parent);
}// BFS Lever Order Traversal
bool isCousins(TreeNode* root, int x, int y) { // time: O(n); space: O(n)
queue<TreeNode*> q({root});
while (!q.empty()) {
int sz = q.size();
bool x_exist = false, y_exist = false;
// A level in BFS
for (int i = 0; i < sz; ++i) {
TreeNode* cur = q.front(); q.pop();
if (cur->val == x) x_exist = true;
else if (cur->val == y) y_exist = true;
if (cur->left && cur->right) {
if ((cur->left->val == x && cur->right->val == y) ||
(cur->left->val == y && cur->right->val == x)) return false;
}
if (cur->left) {
q.push(cur->left);
}
if (cur->right) {
q.push(cur->right);
}
}
if (x_exist && y_exist) return true;
else if (x_exist || y_exist) return false; // x and y are not in the same depth level
}
return false;
}