993. 二叉树的堂兄弟节点 - 力扣(LeetCode)

题目描述

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

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

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

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

题目示例

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

解题思路

广度优先搜索
我们定义一个队列 q,队列中存储的是节点和其父节点。初始时,将根节点和空节点放入队列中。

每次从队列中取出一个节点,如果该节点的值为 x 或 y,则记录该节点的父节点和深度。如果该节点的左右子节点不为空,则将左右子节点和该节点放入队列中。

当队列中所有节点都处理完毕后,如果 x 和 y 的深度相同且父节点不同,则返回 true,否则返回 false。

深度优先搜索
我们设计一个函数 dfs(root,parent,depth),表示从根节点 root 出发,其父节点为 parent,深度为 depth,进行深度优先搜索。

在函数中,我们首先判断当前节点是否为空,如果为空,则直接返回。如果当前节点的值为 x 或 y,则记录该节点的父节点和深度。然后对当前节点的左右子节点分别调用函数 dfs,其中父节点为当前节点,深度为当前深度加 1。即 dfs(root.left,root,depth+1) 和 dfs(root.right,root,depth+1)。

当整棵二叉树遍历完毕后,如果 x 和 y 的深度相同且父节点不同,则返回 true,否则返回 false。

参考代码

广度优先搜索

class Solution {
    public boolean isCousins(TreeNode root, int x, int y) {
        
        // 定义一个队列,记录当前节点和父节点
        Queue<TreeNode[]> queue = new LinkedList<>();
        queue.add(new TreeNode[] {root, null});

        int d1 = 0, d2 = 0;
        TreeNode p1 = null, p2 = null;

        // 遍历直到队列无元素,遍历的层数,即代表都遍历完
        for(int depth = 0; !queue.isEmpty(); depth++) {
            // 队列有一个元素,就遍历几次
            for(int n = queue.size(); n > 0; n--) {
                // 弹出队列元素
                TreeNode[] t = queue.poll();
                TreeNode node = t[0], parent = t[1];
                // 判断是不是x和y的目标值
                if(node.val == x) {
                    d1 = depth;
                    p1 = parent;
                } else if(node.val == y) {
                    d2 = depth;
                    p2 = parent;
                }
                if(node.left != null) {
                    queue.add(new TreeNode[] {node.left, node});
                }
                if(node.right != null) {
                    queue.add(new TreeNode[] {node.right, node});
                }
            }
        }
        return p1 != p2 && d1 == d2;
    }
}

深度优先搜索

class Solution {
    private int x, y;
    private int d1, d2;
    private TreeNode p1, p2;

    public boolean isCousins(TreeNode root, int x, int y) {
        this.x = x;
        this.y = y;
        dfs(root, null, 0);
        return p1 != p2 && d1 == d2;
    }

    private void dfs(TreeNode root, TreeNode parent, int depth) {
        if (root == null) {
            return;
        }
        if (root.val == x) {
            d1 = depth;
            p1 = parent;
        } else if (root.val == y) {
            d2 = depth;
            p2 = parent;
        }
        dfs(root.left, root, depth + 1);
        dfs(root.right, root, depth + 1);
    }
}

你可能感兴趣的:(leetcode,深度优先,算法)