1145. 二叉树着色游戏

news2025/1/11 0:50:01

有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同。

最开始时:

  • 「一号」玩家从 [1, n] 中取一个值 x1 <= x <= n);
  • 「二号」玩家也从 [1, n] 中取一个值 y1 <= y <= n)且 y != x

「一号」玩家给值为 x 的节点染上红色,而「二号」玩家给值为 y 的节点染上蓝色。

之后两位玩家轮流进行操作,「一号」玩家先手。每一回合,玩家选择一个被他染过色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色(「一号」玩家染红色,「二号」玩家染蓝色)。

如果(且仅在此种情况下)当前玩家无法找到这样的节点来染色时,其回合就会被跳过。

若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ✌️。

现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true ;若无法获胜,就请返回 false 。

示例 1 :

输入:root = [1,2,3,4,5,6,7,8,9,10,11], n = 11, x = 3
输出:true
解释:第二个玩家可以选择值为 2 的节点。

示例 2 :

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

 

大概题意:一号玩家和二号玩家在树中选择一个结点涂色,之后从第一次选择的的结点的父节点和左右子节点继续选择并涂色,哪位玩家最后涂色结点多,哪位玩家获胜。

要让二号玩家获胜需要二号玩家最后涂的颜色多于一号,则最少要多余所有节点的一半,根据一号玩家选择的位置可以将整个树分为三块区域,一号玩家可以向三个方向延续染色,要想让二号玩家染色多于一号,则必须选择紧邻一号玩家位置的结点,这样就保证在一号玩家确定位置之后,二号玩家可以获得最多的可染色结点,从三个区域选择一个最大区域,如果三个区域中有一个区域包含的结点值大于总结点的一半。则二号玩家可以获胜。二号玩家选择的位置为该区域紧邻x结点的结点。

深搜广搜的理解 可查看这篇文章的比喻

 

深搜和广搜的原理及优缺点_June·D的博客-CSDN博客_深搜和广搜

以下理解可跳过

(一)深度优先搜索的特点是:

    1.深度优先搜索法有递归以及非递归两种设计方法。一般的,当搜索深度较小、问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂。当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设计比较好。

2.深度优先搜索方法有广义和狭义两种理解。广义的理解是,只要最新产生的结点(即深度最大的结点)先进行扩展的方法,就称为深度优先搜索方法。在这种理解情况下,深度优先搜索算法有全部保留和不全部保留产生的结点的两种情况。而狭义的理解是,仅仅只保留全部产生结点的算法。本书取前一种广义的理解。不保留全部结点的算法属于一般的回溯算法范畴。保留全部结点的算法,实际上是在数据库中产生一个结点之间的搜索树,因此也属于图搜索算法的范畴。

3.不保留全部结点的深度优先搜索法,由于把扩展望的结点从数据库中弹出删除,这样,一般在数据库中存储的结点数就是深度值,因此它占用的空间较少,所以,当搜索树的结点较多,用其他方法易产生内存溢出时,深度优先搜索不失为一种有效的算法。

4.不一定会得到最优解,这个时候需要修改原算法:把原输出过程的地方改为记录过程,即记录达到当前目标的路径和相应的路程值,并与前面已记录的值进行比较,保留其中最优的,等全部搜索完成后,才把保留的最优解输出。

二、广度优先搜索法的显著特点是:

(1)在产生新的子结点时,深度越小的结点越先得到扩展,即先产生它的子结点。为使算法便于实现,存放结点的数据库一般用队列的结构。

(2)无论问题性质如何不同,利用广度优先搜索法解题的基本算法是相同的,但数据库中每一结点内容,产生式规则,根据不同的问题,有不同的内容和结构,就是同一问题也可以有不同的表示方法。

(3)当结点到跟结点的费用(有的书称为耗散值)和结点的深度成正比时,特别是当每一结点到根结点的费用等于深度时,用广度优先法得到的解是最优解,但如果不成正比,则得到的解不一定是最优解。这一类问题要求出最优解,一种方法是使用后面要介绍的其他方法求解,另外一种方法是改进前面深度(或广度)优先搜索算法:找到一个目标后,不是立即退出,而是记录下目标结点的路径和费用,如果有多个目标结点,就加以比较,留下较优的结点。把所有可能的路径都搜索完后,才输出记录的最优路径。

(4)广度优先搜索算法,一般需要存储产生的所有结点,占的存储空间要比深度优先大得多,因此程序设计中,必须考虑溢出和节省内存空间得问题。

(5)比较深度优先和广度优先两种搜索法,广度优先搜索法一般无回溯操作,即入栈和出栈的操作,所以运行速度比深度优先搜索算法法要快些。

 总之,一般情况下,深度优先搜索法占内存少但速度较慢,广度优先搜索算法占内存多但速度较快,在距离和深度成正比的情况下能较快地求出最优解。因此在选择用哪种算法时,要综合考虑。决定取舍。

 代码解答

class Solution {
    //定义全局变量作为x的当前位置结点
    TreeNode xNode;
    public boolean btreeGameWinningMove(TreeNode root, int n, int x) {
        findX(root,x);
        //计算x结点左子节点区域的结点数目
        int leftSize = getSubtreeSize(xNode.left);
        //判断是否多余一半结点
        if (leftSize >= (n + 1) / 2){
            return true;
        }
        //计算x结点右子节点区域的结点数目
        int rightSize = getSubtreeSize(xNode.right);
        //判断是否多余一半结点
        if (rightSize >= (n + 1) / 2){
            return true;
        }
        //计算x结点父节点区域的结点数目
        int fatherSize = n - 1 - leftSize - rightSize;
        //判断是否多余一半结点
        if (fatherSize >= (n + 1) / 2){
            return true;
        }
        return false;
    }
    //寻找x结点在树中的位置
    public void findX(TreeNode node, int x){
        //判断是否已经找到或者当前树是否为空
        if (xNode != null || node == null){
            return;
        }
        //找到x的结点值 将node值赋给xNode
        if (node.val == x){
            xNode = node;
            return;
        }
        //递归向左右子树寻找x结点
        findX(node.left,x);
        findX(node.right,x);
    }
    //计算左右结点数目
    public int getSubtreeSize(TreeNode node){
        if (node == null){
            return 0;
        }
        //递归继续往下寻找
        return 1 + getSubtreeSize(node.left) + getSubtreeSize(node.right);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件工程期末考试

软件工程一、简答题&#xff08;5个&#xff09;什么是软件危机&#xff1f;软件危机产生的原因是什么&#xff1f;怎样克服软件危机&#xff1f;你认为摆脱软件危机了吗&#xff1f;软件危机&#xff1a;是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题和难题。它…

QT opencv 学习day01 安装opencv ,

1. 安装opencv 教程 看这个大佬的链接 &#xff08;实测有用&#xff09;&#xff08;操作简单&#xff09; 链接&#xff1a; (1条消息) 【OpenCV】windows Qt环境搭建_logani的博客-CSDN博客 2. 使用opencv 的注意事项 1.首先要在工程文件 .pro 文件里面 加入路径&#x…

Springboot+Echarts实现数据可视化项目

首先,得明白 springboot 需要写什么内容? 先理解下 MVC 模式! bean 层 也称之为 Dao 层 包括XxxMapper.java(数据库访问接口类),XxxMapper.xml(数据库链接实现);mapper 层 也称之为 model层,模型层,entity层,实体层 就是数据库表的映射实体类,存放POJO对象;servi…

Nginx反向代理与负载均衡

一.何为反向代理? 在介绍反向代理之前&#xff0c;先来了解一下正向代理。 正向代理&#xff1a;如果把局域网外的Internet想象成一个巨大的资源库&#xff0c;则局域网中的客户端要访问Internet&#xff0c;则需要通过代理服务器来访问&#xff0c;这种代理服务就称为正向代…

【前端利器炫酷的CodePen】

前言众所周知&#xff0c;前端是一个很容易将自己的劳动成果呈现出来的一个职位&#xff0c;无论是写1行代码还是写100行代码&#xff0c;都可以通过页面来进行呈现&#xff0c;在工作中的劳作成果也是可以一眼就呈现给客户、用户的。比如一些精美的页面&#xff0c;炫酷的特效…

java集合: ArrayList的底层机制和使用方法

文章目录引言一、Arraylist是什么&#xff1f;二、Arraylist的底层扩容机制(面向面试)1.扩容机制2.扩容过程:3步骤3.注意事项三、使用步骤1.ArrayList类引入2.添加元素3.删除元素4.计算大小5.其他的引用类型6.ArrayList 排序7.ArrayList的遍历方法8.Java ArrayList 方法表格引言…

HTML5+CSS3(六)-全面详解(学习总结---从入门到深化)

目录 CSS简介 CSS概念 为什么需要CSS CSS和HTML之间的关系 语法 学习效果反馈 CSS的引入方式 内联样式&#xff08;行内样式&#xff09; 内部样式 外部样式&#xff08;推荐&#xff09; 导入式&#xff08;了解&#xff09; import和link的区别 学习效果反馈 CSS样式…

代码随想录day53 动态规划

代码随想录day53 动态规划 题392 判断是否子序列 1&#xff0c;与最长公共子序列类似&#xff0c;最后公共子序列的长度要等于s的长度。区别在于当遍历元素不想等的时候&#xff0c;对于字符串s&#xff08;子序列&#xff09;不需要删除&#xff0c;对于字符串t&#xff0c;…

Android---CoordinatorLayout原理

目录 CoordinatorLayout 的作用 CoordinatorLayout 的功能 1 处理子控件之间依赖下的交互 2 处理子控件之间的嵌套滑动 3 处理子控件的测量与布局 4 处理子控件的事件拦截与响应 CoordinatorLayout 下的事件传递机制 CoordinatorLayout 协调者布局。 CoordinatorLayout…

Java基础之序列化与反序列化

序列化&#xff1a;将java对象转化为字节序列的过程。 反序列化&#xff1a;将字节序列转化为java对象的过程。 在进行远程通信时&#xff0c;如果需要传输java对象&#xff1a;发送方需要把java对象转换为字节序列(也就是序列化)&#xff0c;接收方需要将字节序列转换为java对…

PHP设计模式总括篇

系列文章目录 第一章 工厂模式 第二章 抽象工厂模式 第三章 单列模式 第五章 责任链模式 第六章 策略模式 一&#xff0c;定义 “每一个模式描述了一个在我们周围不断重复发生的**问题&#xff0c;以及该问题的解决方案的核心。**这样&#xff0c;你就能一次又一次地使用该方…

都React V18了,还不会正确使用React Hooks吗,万字长文解析Hooks的常见问题

前言 今天主要想说一下react hooks&#xff0c;react hooks是react v16.8 之后引入的API&#xff0c;现在react都已经到V18了&#xff0c;hooks怎么还能不会用呢&#xff1f; 首先hooks引入的目的是给函数式组件增加数据状态管理的能力&#xff0c;同时增加代码的可复用能力。…

C++的类型转换详解

目录前言一、C语言中的类型转换二、为什么C需要四种类型转换三、C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast向上转型向下转型四、RTTI(了解)总结前言 在C语言就已经存在了类型转化&#xff0c;但是其中的一些类型转换存在一些问题&…

4.7--贪心--多机调度问题

贪心选择--最长处理时间作业优先&#xff08;n个作业&#xff0c;m台相同机器&#xff09; 当n<m时&#xff0c;只要将机器i的[0, ti]时间区间分配给作业i即可&#xff0c;算法只需要O(1)时间。 当n>m时&#xff0c;首先将n个作业依其所需的处理时间从大到小排…

开发者开年变富,如何迈出第一步?| 「钞能力养成指北」前传

写在前面 &#xff1a; 面对全面放开后多样的消费机会&#xff0c;开发者们如何在保障品质生活的同时&#xff0c;借助开源工具&#xff0c;全面、科学地规划和管理个人财务&#xff0c;把握资金动向&#xff0c;避开消费陷阱&#xff1f; LigaAI 特邀我司 Nerd4me 大佬分享其个…

Apollo planning之交规决策技术

Apollo studio 官网&#xff1a;Apollo开发者社区 (baidu.com) 目录 1 双层状态机 2 决策模块的解析 2.1 参考路径 2.2 交规决策 2.3 路径决策 2.4 速度决策 2.5 场景的调度与管理 3 交规决策实现代码解读 3.1 遍历交规配置文件&#xff0c;存储信息 3.2 交规决…

分布式(三)

三、API 网关详解 1. 网关及作用 主要功能&#xff1a;请求过滤 网关可以为我们提供请求转发、安全认证&#xff08;身份/权限认证&#xff09;、流量控制、负载均衡、降级熔断、日志、监控等功能。 2. 常见的网关系统 2.1 Netflix Zuul &#xff08;1&#xff09;Zuul 是…

进军存储赛道—BNB Greenfield:Web3 数据所有权和效用新标准

最近BNB Chain 自豪地宣布发布BNB Greenfield 白皮书。BNB Greenfield为Web3时代的数据引入了一个全新的结构和经济模式。现在&#xff0c;数据的所有权、使用权和货币化&#xff0c;首先对用户以及BNB Chain生态系统中的所有参与者来说是可能的。BNB Greenfield 使用 BNB 作为…

OSCP_VULHUB_symfonos-2(失败)

文章目录 前言实验攻击尝试hydra爆破ftpmetasploit工具进行SSH登录端口转发1命令注入getshell 1端口转发2提权失败总结前言 这个是练习的第5个机子。 目标地址 https://www.vulnhub.com/entry/symfonos-2,331/ 实验 1.信息收集 1.1 目标ip 1.2 开放端口 nmap -sS -sV -A …

QT入门Buttons之QCommandLinkButton、QDialogButtonBox

目录 一、QCommandLinkButton界面布局介绍 二、QCommandLinkButton基本属性介绍 三、QDialogButtonBox界面布局介绍 1、布局器中的位置及使用 此文为作者原创&#xff0c;转载请标明出处&#xff01; 一、QCommandLinkButton界面布局介绍 一般这两个控件使用较少&#xf…