Two nodes of a binary tree are cousins if they have the same depth with different parents.
Note that in a binary tree, the root node is at the depth 0, and children of each depth k node are at the depth k + 1.
Example 1:
Input: root = [1,2,3,4], x = 4, y = 3
Output: false
Example 2:
Input: root = [1,2,3,null,4,null,5], x = 5, y = 4
Output: true
Example 3:
Input: root = [1,2,3,null,4], x = 2, y = 3
Output: false
Constraints:
The number of nodes in the tree is in the range [2, 100].
1 <= Node.val <= 100
Each node has a unique value.
x != y
x and y are exist in the tree.
解法1:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isCousins(TreeNode* root, int x, int y) {
if (root->val == x || root->val == y) return false;
helper(root, x, y, 0);
if (depthX == depthY && fatherX != fatherY) {
return true;
} else {
return false;
}
}
private:
TreeNode *fatherX = NULL, *fatherY = NULL;
int depthX = 0, depthY = 0;
void helper(TreeNode *root, int x, int y, int depth) {
if (!root || (fatherX && fatherY)) return;
if (!fatherX) {
if ((root->left && root->left->val == x) ||
(root->right && root->right->val == x)) {
depthX = depth + 1;
fatherX = root;
}
}
if (!fatherY) {
if ((root->left && root->left->val == y) ||
(root->right && root->right->val == y)) {
depthY = depth + 1;
fatherY = root;
}
}
helper(root->left, x, y, depth + 1);
helper(root->right, x, y, depth + 1);
}
};
二刷:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool isCousins(TreeNode* root, int x, int y) {
helper(root, x, y, 0, NULL);
if (depthX == depthY && fatherX != fatherY) return true;
return false;
}
private:
int depthX = 0, depthY = 0;
TreeNode *fatherX = NULL, *fatherY = NULL;
void helper(TreeNode *root, int x, int y, int depth, TreeNode *father) {
if (!root) return;
if (root->val == x) {
fatherX = father;
depthX = depth;
}
if (root->val == y) {
fatherY = father;
depthY = depth;
}
helper(root->left, x, y, depth + 1, root);
helper(root->right, x, y, depth + 1, root);
}
};