Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【面试高频题】难度 1/5,找二叉树的堂兄弟节点(树的搜索运用题)

【面试高频题】难度 1/5,找二叉树的堂兄弟节点(树的搜索运用题)

作者头像
宫水三叶的刷题日记
发布于 2022-04-06 13:40:07
发布于 2022-04-06 13:40:07
35900
代码可运行
举报
运行总次数:0
代码可运行

题目描述

这是 LeetCode 上的「993. 二叉树的堂兄弟节点」,难度为「简单」

Tag : 「树的搜索」、「BFS」、「DFS」

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

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

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

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

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:root = [1,2,3,4], x = 4, y = 3

输出:false

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:root = [1,2,3,null,4,null,5], x = 5, y = 4

输出:true

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:root = [1,2,3,null,4], x = 2, y = 3

输出:false

提示:

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

DFS

显然,我们希望得到某个节点的「父节点」&「所在深度」,不难设计出如下「DFS 函数签名」:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 查找 t 的「父节点值」&「所在深度」
 * @param root 当前搜索到的节点
 * @param fa root 的父节点
 * @param depth 当前深度
 * @param t 搜索目标值
 * @return [fa.val, depth]
 */
int[] dfs(TreeNode root, TreeNode fa, int depth, int t);

之后按照遍历的逻辑处理即可。

需要注意的时,我们需要区分出「搜索不到」和「搜索对象为 root (没有 fa 父节点)」两种情况。

我们约定使用 -1 代指没有找到目标值 t ,使用 0 代表找到了目标值 t ,但其不存在父节点。

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public boolean isCousins(TreeNode root, int x, int y) {
        int[] xi = dfs(root, null, 0, x);
        int[] yi = dfs(root, null, 0, y);
        return xi[1] == yi[1] && xi[0] != yi[0];
    }
    int[] dfs(TreeNode root, TreeNode fa, int depth, int t) {
        if (root == null) return new int[]{-1, -1}; // 使用 -1 代表为搜索不到 t
        if (root.val == t) {
            return new int[]{fa != null ? fa.val : 1, depth}; // 使用 1 代表搜索值 t 为 root
        }
        int[] l = dfs(root.left, root, depth + 1, t);
        if (l[0] != -1) return l;
        return dfs(root.right, root, depth + 1, t);
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:忽略递归开销为 O(1) ,否则为O(n)

BFS

能使用 DFS,自然也能使用 BFS,两者大同小异。

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public boolean isCousins(TreeNode root, int x, int y) {
        int[] xi = bfs(root, x);
        int[] yi = bfs(root, y);
        return xi[1] == yi[1] && xi[0] != yi[0];
    }
    int[] bfs(TreeNode root, int t) {
        Deque<Object[]> d = new ArrayDeque<>(); // 存储值为 [cur, fa, depth]
        d.addLast(new Object[]{root, null, 0});
        while (!d.isEmpty()) {
            int size = d.size();
            while (size-- > 0) {
                Object[] poll = d.pollFirst();
                TreeNode cur = (TreeNode)poll[0], fa = (TreeNode)poll[1];
                int depth = (Integer)poll[2];

                if (cur.val == t) return new int[]{fa != null ? fa.val : 0, depth};
                if (cur.left != null) d.addLast(new Object[]{cur.left, cur, depth + 1});
                if (cur.right != null) d.addLast(new Object[]{cur.right, cur, depth + 1});
            }
        }
        return new int[]{-1, -1};
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

最后

这是我们「刷穿 LeetCode」系列文章的第 No.993 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。

为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。

在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 宫水三叶的刷题日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
leetcode刷题(20)——993. 二叉树的堂兄弟节点
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
老马的编程之旅
2022/06/22
1890
LeetCode 993. 二叉树的堂兄弟节点(层序遍历)
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
Michael阿明
2020/07/13
7670
LeetCode 993. 二叉树的堂兄弟节点(层序遍历)
​LeetCode刷题实战102:二叉树的层序遍历
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/01/20
2980
​LeetCode刷题实战102:二叉树的层序遍历
【面试高频题】二叉树"神级遍历"入门
Tag : 「二叉树」、「树的搜索」、「递归」、「迭代」、「中序遍历」、「Morris 遍历」
宫水三叶的刷题日记
2023/09/22
2410
【面试高频题】二叉树"神级遍历"入门
二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。
数据结构和算法
2024/10/11
1000
二叉树的最小深度
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】
题目:请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
YoungMLet
2024/03/01
1170
【Leetcode -872.叶子相似的树 -993.二叉树的堂兄弟节点】
【面试高频题】难度 1/5,简单二叉树寻值问题
这是 LeetCode 上的 「230. 二叉搜索树中第K小的元素」 ,难度为 「中等」。
宫水三叶的刷题日记
2023/02/27
3850
【面试高频题】难度 2/5,真实面试难度的「树的遍历」运用题
二叉树根节点所在层下标为 ,根的子节点所在层下标为 ,根的孙节点所在层下标为 ,依此类推。
宫水三叶的刷题日记
2022/05/25
5280
【面试高频题】难度 2/5,真实面试难度的「树的遍历」运用题
【LeetCode每日一题】993. 二叉树的堂兄弟节点
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
公众号guangcity
2021/05/31
2150
.二叉树的堂兄弟节点
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
ruochen
2021/11/26
8250
Leetcode 993. 二叉树的堂兄弟节点
在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。
zhipingChen
2019/05/26
4470
【图论搜索专题】结合「二叉树」的图论搜索问题
这是 LeetCode 上的「863. 二叉树中所有距离为 K 的结点」,难度为「中等」。
宫水三叶的刷题日记
2021/12/21
9740
【图论搜索专题】结合「二叉树」的图论搜索问题
二叉树问题(二)-LeetCode 965、563、993、958、919(树深度,层次遍历)
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。
算法工程师之路
2019/12/24
3670
LeetCode-199-二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
benym
2022/07/14
2080
LeetCode 366. 寻找二叉树的叶子节点(上下翻转二叉树+BFS)
1. 题目 给你一棵二叉树,请按以下要求的顺序收集它的全部节点: 依次从左到右,每次收集并删除所有的叶子节点 重复如上过程直到整棵树为空 示例: 输入: [1,2,3,4,5] 1 / \ 2 3 / \ 4 5 输出: [[4,5,3],[2],[1]] 解释: 1. 删除叶子节点 [4,5,3] ,得到如下树结构: 1 / 2
Michael阿明
2020/07/13
1.5K0
104 二叉树最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
木瓜煲鸡脚
2021/01/18
4110
104 二叉树最大深度
有关二叉树的一些题解
有关二叉树的一些题解 没有将全部思想写上,因为本着本人的一些自私所以都挑选了本人比较熟悉的思想 类名命名为中文纯属个人故意的,业务中千万不要用中文,我只是懒得起名字了 翻转二叉树 迭代 /** * @author ZVerify * @since 2022/10/30 16:41 * @see <a href="https://leetcode.cn/problems/invert-binary-tree/description/">...</a> **/ public class 翻转二叉
用户10136162
2022/11/15
2260
剑指offer | 面试题41:二叉树的深度
死磕算法系列文章 干货 | 手撕十大经典排序算法 剑指offer | 认识面试 剑指offer | 面试题2:实现Singleton模式 剑指offer | 面试题3:二维数组的查找 剑指offer | 面试题4:替换空格 剑指offer | 面试题5:从尾到头打印链表 剑指offer | 面试题6:重建二叉树 剑指offer | 面试题7:用两个栈实现队列 剑指offer | 面试题8:旋转数组的最小数字 剑指offer | 面试题9:斐波那契数列 剑指offer | 面试题10:青蛙跳台阶问题 剑指
千羽
2022/02/23
2730
剑指offer | 面试题41:二叉树的深度
LeetCode 742. 二叉树最近的叶节点(建立父节点信息+BFS)
给定一个 每个结点的值互不相同 的二叉树,和一个目标值 k,找出树中与目标值 k 最近的叶结点。
Michael阿明
2020/07/13
1.3K0
面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!
所谓排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。
圆号本昊
2021/09/24
3670
面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」必问之 排序 + 二叉树 部分!
推荐阅读
相关推荐
leetcode刷题(20)——993. 二叉树的堂兄弟节点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档