【Leetcode】993. 二叉树的堂兄弟节点

文章目录

  • 题目
  • 解法一
    • 思路一
    • 代码一
    • 结果
  • 解法二
    • 思路二
    • 代码二
    • 结果二

题目

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

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

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

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

示例 1
【Leetcode】993. 二叉树的堂兄弟节点_第1张图片
输入:root = [1,2,3,4], x = 4, y = 3
输出:false

示例 2
【Leetcode】993. 二叉树的堂兄弟节点_第2张图片
输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
输出:true

示例 3
【Leetcode】993. 二叉树的堂兄弟节点_第3张图片
输入:root = [1,2,3,null,4], x = 2, y = 3
输出:false

提示:

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

解法一

思路一

使用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 dx, dy, fx, fy;
    void dfs(TreeNode *root, int depth, int x, int y, int fa){
        if(root == nullptr)
            return;
        if(root->val == x) dx = depth, fx = fa;
        if(root->val == y) dy = depth, fy = fa;
        dfs(root->left, depth + 1, x, y, root->val);
        dfs(root->right, depth + 1, x, y, root->val);
    }

    bool isCousins(TreeNode* root, int x, int y) {
        dfs(root, 0, x, y, -1);
        return dx == dy && fx != fy;
    }                          
};

结果

【Leetcode】993. 二叉树的堂兄弟节点_第4张图片

解法二

思路二

定义一个队列来处理二叉树中的节点,以检查特定值(x 和 y)的节点是否满足以下条件:它们的深度相同且它们的父节点不同。

代码二

/**
 * 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)
            return false;
        queue q;
        q.emplace(root);
        int len = 0;
        TreeNode* ptr = nullptr;
        while(!q.empty()){
            len = q.size();
            bool flagx = false,flagy = false;
            for(int i = 0;ival==x){
                    if(flagy)
                        return true;
                    flagx = true;
                }
                if(ptr->val==y){
                    if(flagx)
                        return true;
                    flagy = true;
                }
                if(ptr->left){
                    q.push(ptr->left);
                }
                if(ptr->right){
                    q.push(ptr->right);
                }
                if(ptr->left&&ptr->right){
                    if((ptr->left->val==x&&ptr->right->val==y)||(ptr->left->val==y&&ptr->right->val==x))
                        return false;
                }
            }
        }
        return false;
    }
};

结果二

【Leetcode】993. 二叉树的堂兄弟节点_第5张图片

你可能感兴趣的:(练习题(记录做题想法),leetcode,深度优先,算法,广度优先,c++)