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;
    }
};
posted @ 2021-05-21 00:39  Mrsdwang  阅读(49)  评论(0编辑  收藏  举报