Visit my LeetCode

力扣 993. 二叉树的堂兄弟节点

993. 二叉树的堂兄弟节点

在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。

如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。

我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。

只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。

示例 1:

输入:root = [1,2,3,4], x = 4, y = 3
输出:false

示例 2:

输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
输出:true

示例 3:

输入:root = [1,2,3,null,4], x = 2, y = 3
输出:false

提示:

二叉树的节点数介于 2 到 100 之间。
每个节点的值都是唯一的、范围为 1 到 100 的整数。

代码:

/**
 * 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 {
private:
    int x;
    int x_depth;
    TreeNode* x_parent;
    bool x_found=false;

    int y;
    int y_depth;
    TreeNode* y_parent;
    bool y_found=false;

    void dfs(TreeNode* node,int depth,TreeNode *parent){
        if(!node) return;
        
        if(node->val==x){
            x_depth=depth;
            x_parent=parent;
            x_found=true;
        }else if(node->val==y){
            y_depth=depth;
            y_parent=parent;
            y_found=true;
        }

        if(x_found&&y_found) return;

        dfs(node->left,depth+1,node);

        if(x_found&&y_found) return;

        dfs(node->right,depth+1,node);
    }

public:
    bool isCousins(TreeNode* root, int x, int y) {
        this->x=x;
        this->y=y;
        dfs(root,0,nullptr);
        return x_depth==y_depth&&x_parent!=y_parent;
    }
};
posted @ 2021-05-17 20:49  Dqarden  阅读(57)  评论(0编辑  收藏  举报