二叉树的堂兄弟节点

简介: 🎈今天给大家带来的是算法练习,题目为二叉树的堂兄弟节点。

说在前面

🎈今天给大家带来的是算法练习,题目为二叉树的堂兄弟节点。

题目描述

在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。\
如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。\
我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。\
只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。\
示例 1:
image.png

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

示例 2:

image.png

输入:root = [1,2,3,null,4,null,5], x = 5, y = 4
输出:true

示例 3:

image.png

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

提示:

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

思路分析

题目要我们求的是二叉树的堂兄弟节点,那么我们首先就要来了解一下什么是堂兄弟节点,简单来说,就是父亲不同但是树节点的深度又是相同的,那么他们就是一对堂兄弟节点,所以我们只要按照题意来,找出两个节点的父节点和节点深度并进行比较即可。这种题目我们可以使用深度优先搜索来进行解题,具体步骤如下:

1649430291(1).jpg
以下几种情况要注意剪枝

  • (1)已经找到两个节点;
  • (2)已经找到第一个节点并且当前遍历深度大于第一个节点深度。

AC代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} x
 * @param {number} y
 * @return {boolean}
 */
var isCousins = function(root, x, y) {
    let pre1 = '',floor1 = Infinity,res = '';
    const compare = function(r,floor,pre){
        if(r.val == x || r.val == y){
            if(floor1 == Infinity){
                floor1 = floor;
                pre1 = pre;
            }else{
                res = (floor1 == floor && pre1 != pre);
            }
            return true;
        }
        return false;
    }
    const dfs = function(r,floor = 0,pre = null){
        if(!r || res != '' || r.val == pre1 || floor > floor1) return;
        if(compare(r,floor,pre)) return;
        dfs(r.left,floor + 1,r.val);
        dfs(r.right,floor + 1,r.val);
    }
    dfs(root);
    return res;
};

说在后面

🎉这里是JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
6月前
|
监控 算法
货拉拉抢单外置辅助器, 抢单加速器永久免费版,脚本插件AUTOJS版
完整的货拉拉接单自动化流程,包含智能订单评估算法、多线程处理、异常恢复等高级功能。代码总行数超过400行
1275 56
|
4月前
|
算法 安全 搜索推荐
算法备案办官方流程
企业办理算法备案需登录备案系统,填写主体及算法信息并提交相关材料。流程包括注册备案、算法信息填报、产品信息提交、审核与公示等环节。企业需提前准备营业执照、身份证明等文件,确保资质真实有效。审核分为主体审核、一审和二审,通过后进入国家网信办公示,公示无异议即获备案号。整个流程约需1个月左右,具体以官方要求为准。
|
4月前
|
数据采集 机器学习/深度学习 监控
代理IP并发控制:多线程爬虫的加速引擎
在数据采集领域,多线程爬虫结合代理IP并发控制技术,有效突破反爬机制。通过动态代理池与智能并发策略,显著提升采集效率并降低封禁率,成为高效数据抓取的关键方案。
183 0
|
5月前
|
API 数据安全/隐私保护
手机一键导出微信群成员名单工具,微信群WXID微信号导出软件,批量导出群成员工具
这段代码使用了itchat库,这是一个基于网页版微信API的第三方库。请注意实际使用时需要扫描二维码登录
陌陌无限注册一键新机,陌陌无限注册活号技术,主要就是看这个插件技术
本项目基于Xposed框架实现陌陌APP的设备信息伪装,避免多账号注册被封号。通过主Hook类、机型伪装逻辑、系统属性拦截器和Xposed入口文件
|
11月前
|
机器学习/深度学习 人工智能 算法
《探秘Q-learning:解锁其背后的基本假设》
Q-learning是强化学习领域的重要算法,广泛应用于机器人控制、游戏策略和资源管理等场景。它基于马尔可夫决策过程假设,认为未来状态仅依赖当前状态和动作,简化了问题复杂度。此外,Q-learning还假设奖励可量化、环境具有重复性、学习时间无限及动作离散,这些假设为智能体提供了明确的学习目标和机制,使其能高效地探索最优策略。尽管现实情况未必完全符合这些假设,Q-learning及其变种算法已在多个领域取得了显著成功。
274 28
|
缓存 NoSQL 数据库
缓存穿透、缓存击穿和缓存雪崩及其解决方案
在现代应用中,缓存是提升性能的关键技术之一。然而,缓存系统也可能遇到一系列问题,如缓存穿透、缓存击穿和缓存雪崩。这些问题可能导致数据库压力过大,甚至系统崩溃。本文将探讨这些问题及其解决方案。
|
机器学习/深度学习 人工智能 算法
探索AI在医疗诊断中的应用:挑战与机遇
本文旨在探讨人工智能(AI)在医疗诊断领域的应用,分析其在提高诊断效率和准确性方面的潜力。同时,讨论了当前面临的挑战,包括数据隐私、算法透明度以及技术普及等问题。通过案例研究,本文展示了AI如何在实际医疗场景中提供辅助诊断,并提出了相应的解决策略。
|
自然语言处理 算法 关系型数据库
postgresql 全文检索 SCWS和zhparser部署
UPDATE report_content SET content_tsv = to_tsvector('testzhcfg',content);
406 8
|
Web App开发 JavaScript 安全
Cordova页面加载外网图片失败,Refused to load the image
原文:Cordova页面加载外网图片失败,Refused to load the image 1.使用Cordova页面加载外网图片失败,抛出异常 Refused to load the image 'http://xxx.
4663 0