993. 二叉树的堂兄弟节点
思路:
DFS寻找x和y,并记录他们所在的深度。
因为题目要求深度相同,父亲节点不同,所以我们还需要记录他们的父亲节点。
所以我们对x和y都建立一些信息,
int x;
TreeNode* x_fa;
int x_depth;
bool x_found;
int y;
TreeNode* y_fa;
int y_depth;
bool y_found;
然后我们dfs即可,首先判断传入的节点是否为空,再判断是否等于x或者y,如果等于就将信息填上。在判断x和y是否都找到了,找到就return,没找到就对node->left dfs,出来后在判断有没有都找到,没有再对node->right dfs。
/**
* 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:
int x;
TreeNode* x_fa;
int x_depth;
bool x_found;
int y;
TreeNode* y_fa;
int y_depth;
bool y_found;
void dfs(TreeNode* node,TreeNode* fa,int depth){
if(node==nullptr) return;
if(node->val==x){
tie(x_fa,x_depth,x_found) = tuple(fa,depth,true);
}
else if(node->val==y){
tie(y_fa,y_depth,y_found) = tuple(fa,depth,true);
}
if(x_found&&y_found) return;
dfs(node->left,node,depth+1);
if(x_found && y_found) return;
dfs(node->right,node,depth+1);
}
bool isCousins(TreeNode* root, int x, int y) {
this->x = x;
this->y = y;
dfs(root,nullptr,0);
return x_depth==y_depth && x_fa != y_fa;
}
};