追求最优美的代码 leetcode 993. 二叉树的堂兄弟节点

题目难度:简单
题目描述:

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

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

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

只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。
在这里插入图片描述
DFS(+纪录式搜索)

class Solution {
    TreeNode parent1 = null;
    TreeNode parent2 = null;
    int floor1 = 0;
    int floor2 = 0;
    
    public boolean isCousins(TreeNode root, int x, int y) {
        dfs(root, null, 0, x, y);
        return floor1==floor2 && parent1!=parent2;
    }

    public void dfs(TreeNode root, TreeNode parent, int floor, int x, int y){
        if (null==root) return;
        if (root.val == x){
            parent1 = parent;
            floor1 = floor;
        }
        if (root.val == y){
            parent2 = parent;
            floor2 = floor;
        }
        dfs(root.left, root, floor+1, x, y);
        dfs(root.right, root, floor+1, x, y);
    }

}

官解不是很优雅,就不看了

高手写法 (BFS)

public boolean isCousins(TreeNode root, int x, int y) {
    Deque<TreeNode[]> q = new LinkedList<>();
    q.offer(new TreeNode[]{root, null});
    while (!q.isEmpty()) {
        int size = q.size();
        int fx = 0, fy = 0;
        TreeNode[] candidates = new TreeNode[2];
        for (int i = 0; i < size; i++) {
            TreeNode[] poll = q.poll();
            TreeNode cur = poll[0], parent = poll[1];
            if (cur.val == x) {
                fx = 1;
                candidates[0] = parent;
            } else if (cur.val == y) {
                fy = 1;
                candidates[1] = parent;
            }
            if (cur.left != null) q.offer(new TreeNode[]{cur.left, cur});
            if (cur.right != null) q.offer(new TreeNode[]{cur.right, cur});
        }
        if (fx == 0 && fy == 0) continue;
        if ((fx ^ fy) == 1) return false;
        if ((fx & fy) == 1) return candidates[0] != candidates[1];
    }
    return false;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值