二叉树题目:二叉树着色游戏

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:二叉树着色游戏

出处:1145. 二叉树着色游戏

难度

6 级

题目描述

要求

两位玩家参与二叉树着色游戏。给定二叉树的根结点 root \texttt{root} root,以及树中的结点数目 n \texttt{n} n n \texttt{n} n 是奇数且每个结点的值从 1 \texttt{1} 1 n \texttt{n} n 各不相同。

初始时,第一位玩家选择一个值 x \texttt{x} x,满足 1 ≤ x ≤ n \texttt{1} \le \texttt{x} \le \texttt{n} 1xn,第二位玩家选择一个值 y \texttt{y} y,满足 1 ≤ y ≤ n \texttt{1} \le \texttt{y} \le \texttt{n} 1yn y ≠ x \texttt{y} \ne \texttt{x} y=x。第一位玩家将值为 x \texttt{x} x 的结点涂上红色,第二位玩家将值为 y \texttt{y} y 的结点涂上蓝色。

之后从第一位玩家开始,两位玩家轮流操作。每一轮,玩家选择自己颜色的结点(第一位玩家选择红色,第二位玩家选择蓝色),将所选结点的一个未涂色的相邻结点(左子结点、右子结点或者父结点)涂上颜色。

当且仅当一位玩家无法按照该规则选择结点时,该玩家必须跳过当前轮次。如果两位玩家都跳过当前轮次,游戏结束,涂色结点更多的玩家是获胜方。

你是第二位玩家。如果可能选择一个 y \texttt{y} y 确保你赢得游戏,返回 true \texttt{true} true。如果不可能,返回 false \texttt{false} false

示例

示例 1:

示例 1

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

示例 2:

输入: root = [1,2,3], n = 3, x = 1 \texttt{root = [1,2,3], n = 3, x = 1} root = [1,2,3], n = 3, x = 1
输出: false \texttt{false} false

数据范围

  • 树中结点数目是 n \texttt{n} n
  • 1 ≤ x ≤ n ≤ 100 \texttt{1} \le \texttt{x} \le \texttt{n} \le \texttt{100} 1xn100
  • n \texttt{n} n 是奇数
  • 1 ≤ Node.val ≤ n \texttt{1} \le \texttt{Node.val} \le \texttt{n} 1Node.valn
  • 树中的所有值各不相同

解法

思路和算法

由于二叉树中的结点数目是 n n n,每个结点的值从 1 1 1 n n n 各不相同, 1 ≤ x ≤ n 1 \le x \le n 1xn,因此二叉树中存在唯一的值为 x x x 的结点,该结点称为结点 x x x

首先使用深度优先搜索在二叉树中定位到结点 x x x,结点 x x x 将二叉树中的其余 n − 1 n - 1 n1 个结点分成三个部分:结点 x x x 的左子树、结点 x x x 的右子树和其余结点,每个部分各为一个连通区域,不同部分之间不连通,每个部分的结点数最少为 0 0 0,最多为 n − 1 n - 1 n1,三个部分的结点数总和为 n − 1 n - 1 n1

根据游戏规则,每一位玩家在分别选择第一个涂色的结点之后,每次选择涂色的结点都必须和己方已经涂色的结点相邻,因此同一位玩家涂色的结点一定总是相连的。由于结点 x x x 被第一位玩家涂色,因此第二位玩家选择的结点 y y y 一定属于三个部分之一,且当第二位玩家选择结点 y y y 之后,只能在同一个部分继续涂色。

第二位玩家为了赢得游戏,选择的结点 y y y 应该使得己方可以涂色的结点数最多,因此结点 y y y 应该位于结点数最多的一个部分。只要结点 y y y 和结点 x x x 相邻,第二位玩家即可确保结点 y y y 所在的部分的所有结点都可以由第二位玩家涂色。为了使得结点 y y y 和结点 x x x 相邻,结点 y y y 应为结点 x x x 的左子结点、右子结点或者父结点,由于结点 y y y 所在的部分的结点数一定大于 0 0 0,因此结点 y y y 不为空。

除了结点 y y y 所在的部分以外,其余结点都由第一位玩家涂色,因此判断第二位玩家是否可以赢得游戏的依据是结点 y y y 所在的部分的结点数是否大于其余结点数总和。由于二叉树中的结点数目 n n n 是奇数,因此第二位玩家可以赢得游戏等价于结点 y y y 所在的部分的结点数至少为 n + 1 2 \dfrac{n + 1}{2} 2n+1

由于第二位玩家选择的结点 y y y 应该位于结点数最多的一个部分,因此只需要判断三个部分的结点数中的最大值是否至少为 n + 1 2 \dfrac{n + 1}{2} 2n+1,即可知道第二位玩家是否可以赢得游戏。

计算三个部分的结点数的方法为:对结点 x x x 的左子树和右子树分别使用深度优先搜索计算结点数,左子树和右子树的结点数分别记为 leftCount \textit{leftCount} leftCount rightCount \textit{rightCount} rightCount,剩下的一个部分的结点数为 n − 1 − leftCount − rightCount n - 1 - \textit{leftCount} - \textit{rightCount} n1leftCountrightCount。只要有一个部分的结点数至少为 n + 1 2 \dfrac{n + 1}{2} 2n+1,则返回 true \text{true} true,否则返回 false \text{false} false

代码

class Solution {TreeNode xNode;public boolean btreeGameWinningMove(TreeNode root, int n, int x) {search(root, x);int threshold = (n + 1) / 2;int leftCount = countSubtreeNodes(xNode.left);if (leftCount >= threshold) {return true;}int rightCount = countSubtreeNodes(xNode.right);if (rightCount >= threshold) {return true;}int remain = n - 1 - leftCount - rightCount;return remain >= threshold;}public void search(TreeNode node, int x) {if (xNode != null || node == null) {return;}if (node.val == x) {xNode = node;return;}search(node.left, x);search(node.right, x);}public int countSubtreeNodes(TreeNode node) {if (node == null) {return 0;}return 1 + countSubtreeNodes(node.left) + countSubtreeNodes(node.right);}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。定位到结点 x x x 和计算二叉树每个部分的结点数的过程中,每个结点最多被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

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

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

相关文章

【稳定检索|投稿优惠】2024年公共服务、健康与医药国际会议(ICPSHM 2024)

2024年公共服务、健康与医药国际会议(ICPSHM 2024) 2024 International Conference on Public Services, Health, and Medicine(ICPSHM) 一、【会议简介】 ​2024年公共服务、健康与医药国际会议(ICPSHM 2024)将于三亚这片美丽的海滨城市盛大召开。我们诚…

送货服务Grupo RÃO将在Moonbeam上通过DUX推出Web3支持的忠诚度计划

波卡上的首选多链开发平台Moonbeam宣布使用由Account Abstraction提供支持的DUX智能钱包为Grupo RO推出Web3忠诚度计划。此次合作为Grupo RO食品配送服务带来了新的奖励计划,其中包括折扣、产品、优惠券、竞赛等福利的订阅 — 所有这些都得益于Moonbeam的区块链技术…

UDP特性之组播(多播)

UDP特性之组播 1. 组播的特点2. 设置主播属性2.1 发送端2.2 接收端 3. 组播通信流程3.1 发送端3.2 接收端 4. 通信代码 原文链接 在公司测试广播和多播有一点问题。。。 1. 组播的特点 组播也可以称之为多播这也是UDP的特性之一。组播是主机间一对多的通讯模式,是…

URP管线下Shader中的SubShader Tags、Pass Tags、ShaderLab Commands总结

一、SubShader Tags SubShader Tags是提供SubShader信息的键值对,它们允许你指定特定的设置好让渲染管线知道如何处理SubShader。 下面分别介绍一下SubShader中的tag。 1、 RenderPipeline 这个tag用来指定SubShader的目标渲染管线,不同的渲染管线有特定…

Vue3源码梳理:运行时之基于h函数生成vnode的内部流程

VNode 节点类型 对于vnode而言,具备很多节点类型vue源码中patch函数switch处理包含了好几种类型,常见类型如下 Text:文本节点Comment:注释节点Static:静态dom节点Fragment:包含多个根节点的模板被表示为一…

SHT10温湿度传感器——STM32驱动

———————实验效果——————— 🎄硬件外观 🎄接线 🎈 3.3V供电 🎈 IIC通讯 🎄 代码获取 🎈 查看下方 ———————END———————

FB使用汇编模拟GoSub(子函数)功能

在FB里不支持GoSub功能,在面对函数内简单又重复的操作,而所涉及变量又比较多的时候,再在外边定义一个函数就显得累赘,此时如果可以有一个函数内部的子函数,就显得方便多了。 在汇编探索里发现,可以使用汇编…

20231218在微软官网下载WINDOWS10以及通过rufus-4.3p写入U盘作为安装盘

20231218在微软官网下载WINDOWS10以及通过rufus-4.3p写入U盘作为安装盘 2023/12/18 17:06 百度搜索:下载 windows10 https://www.microsoft.com/zh-cn/software-download/windows10 下载 Windows 10 更新之前,请参阅 Windows 版本信息状态中的已知问题&a…

企业要想成功就必须培养“支持说真话的文化”

大家好,欢迎来到我的博客。今天,我想和大家谈谈企业文化的重要性,特别是支持说真话的文化。 1. 为什么说真话很重要? 在当今社会,说真话似乎越来越难了。我们害怕得罪别人,害怕被孤立,害怕被认…

系统设计——系统安全

HTTPS 是如何工作的? 安全超文本传输​​协议(HTTPS)是超文本传输​​协议(HTTP)的扩展。HTTPS 使用传输层安全性(TLS)传输加密数据。如果数据在网上被劫持,劫持者得到的只是二进制…

php去掉数组的key,重组数组的方法

php去掉数组的key,重组数组的方法 方法一:foreach循环方法二:array_values()函数方法三:array_map()函数方法四:强制类型转换 方法一:foreach循环 使用foreach循环遍历数组时,可以只取出数组的…

TaxtArea中内嵌一张放松图片,该图片实现属性悬浮放大功能

TaxtArea中内嵌一张发送图片&#xff0c;该图片实现属性悬浮放大功能&#xff0c;离开还原效果&#xff0c;点击发送按钮后&#xff0c;发送图片变为loading&#xff0c; <div class"textarea-wrapper" ><a-textarearef"textArea"v-model.trim&q…

汇编语言学习(3)

更好的阅读体验&#xff0c;请点击 YinKai s Blog 。 内存段 ​ 上面讨论的汇编程序的三个部分&#xff0c;也代码各种内存段。 ​ 有趣的是&#xff0c;如果将 section 关键字替换为 segment&#xff0c;将会得到相同的结果&#xff0c;这是因为对于汇编器而言&#xff0c;这…

web应用开发技术的一些概念

一、Servlet 1.Servlet的工作过程&#xff1a; Servelt的工作流程示意图 &#xff08;1&#xff09;客户端发起一个Http请求到服务器&#xff0c;请求特定的资源或者是要执行特定的操作 &#xff08;2&#xff09;服务器在接收到请求后&#xff0c;根据请求相应的URL将请求分发…

PostgreSQL进阶操作

PostgreSQL进阶操作 SQL执行顺序 (9) SELECT (10) DISTINCT col1, [OVER()] (6) AGG_FUNC(col2) (1) FROM table1 (3) JOIN table2 (2) ON table1.col table2.col (4) WHERE constraint_expression (5) GROUP BY col (7) WITH CUBE|ROLLUP (8) HAVING constraint_expression…

21、同济、微软亚研院、西安电子科技大提出HPT:层次化提示调优,独属于提示学习的[安妮海瑟薇]

前言&#xff1a; 本论文由同济大学、微软亚洲研究院、西安电子科技大学&#xff0c;于2023年12月11日中了AAAI2024 论文&#xff1a; 《Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models》 地址&#xff1a; [2312.06323]…

C++泛型超详细合集-泛化的编程方式-程序员编写一个函数/类的代码让编译器去填补出不同的函数实现-供大家学习研究参考

以Add函数为例&#xff0c;在函数模板存在的同时&#xff0c;我们还可以单独写一个int类型的add函数。这都归功于函数重载的存在。 同时&#xff0c;我们还可以使用<int>来指定函数模板重载为已存在的Add函数。因为本质上这两个函数是不同的&#xff0c;并不会冲突。 下…

js 数据类型

js的八种数据类型&#xff1a; 基本类型&#xff08;基本类型&#xff09;&#xff1a;Number&#xff0c;String&#xff0c;Boolean&#xff0c;Undefined&#xff0c;Null&#xff0c;Symbol 引用数据类型&#xff08;对象类型&#xff09;&#xff1a;Object&#xff0c;…

mybatis中xml文件容易搞混的属性

目录 第一章、1.1&#xff09;MyBatis中resultMap标签1.2&#xff09;MyBatis的resultType1.3&#xff09;MyBatis的parameterType1.4&#xff09;type属性1.5&#xff09;jdbcType属性1.6&#xff09;javaType属性1.7&#xff09;ofType属性 友情提醒: 先看文章目录&#xff…

【k8s】--insecure-registry详解 ( 访问仓库、https、http)

文章目录 一、--insecure-registry是什么二、如何使用--insecure-registry三、--insecure-registry的安全风险四、--insecure-registry的替代方案五、总结参考 一、–insecure-registry是什么 --insecure-registry是docker中用来设置与docker registry通信的安全限制的一个参数…