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

Posted 深林无鹿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了追求最优美的代码 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;
}

以上是关于追求最优美的代码 leetcode 993. 二叉树的堂兄弟节点的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二叉树》简单07 —— LeetCode 993. 二叉树的堂兄弟节点

[LeetCode]993. 二叉树的堂兄弟节点(Java/c++ DFS)

[LeetCode]993. 二叉树的堂兄弟节点(Java/c++ DFS)

[LeetCode]993. 二叉树的堂兄弟节点(Java/c++ DFS)

LeetCode 993 二叉树的堂兄弟节点[DFS 回溯] HERODING的LeetCode之路

leetcode 993. 二叉树的堂兄弟节点