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

文章目录

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

题目

标题和出处

标题:二叉树着色游戏

出处: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)将于三亚这片美丽的海滨城市盛大召开。我们诚…

UDP特性之组播(多播)

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

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

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

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…

系统设计——系统安全

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

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

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

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

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

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;并不会冲突。 下…

猫粮哪个牌子好又安全?好又安全的主食冻干猫粮牌子推荐

现在越来越多的铲屎官关注猫咪的食品选择&#xff0c;而冻干猫粮一直是热门话题。其中主食冻干的肉含量很高&#xff0c;富含猫咪成长所需的蛋白质、维生素等营养物质。而且冻干工艺还保留了食材的原始风味&#xff0c;复水后可以恢复鲜肉的口感&#xff0c;猫咪很喜欢吃&#…

人工智能Keras图像分类器(CNN卷积神经网络的图片识别篇)

上期文章我们分享了人工智能Keras图像分类器(CNN卷积神经网络的图片识别的训练模型),本期我们使用预训练模型对图片进行识别:Keras CNN卷积神经网络模型训练 导入第三方库 from keras.preprocessing.image import img_to_array from keras.models import load_model impor…

关于“Python”的核心知识点整理大全27

目录 10.5 小结 第&#xff11;1 章 测试代码 11.1 测试函数 name_function.py 函数get_formatted_name()将名和姓合并成姓名&#xff0c;在名和姓之间加上一个空格&#xff0c;并将它们的 首字母都大写&#xff0c;再返回结果。为核实get_formatted_name()像期望的那样工…

arcgis javascript api4.x加载天地图cgs2000坐标系

需求&#xff1a;arcgis javascript api4.x加载天地图cgs2000坐标系 效果&#xff1a; 示例代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"wid…

Python爬虫-解决使用requests,Pyppeteer,Selenium遇到网站显示“您的连接不是私密连接”的问题|疑难杂症解决(2)

前言 本文是该专栏的第13篇,后面会持续分享python爬虫案例干货,记得关注。 相信很多同学在处理爬虫项目的时候,会遇到一些网站出现如下图所示的情况: 就是当你不论是使用requests进行协议请求,还是使用自动化框架pyppeteer或者selenium都会出现上图中的情况。这相信会或多…

年度大盘点:AIGC、AGI、GhatGPT震撼登场!揭秘人工智能大模型的奥秘与必读书单

这里写目录标题 前言01 《ChatGPT 驱动软件开发》02 《ChatGPT原理与实战》03 《神经网络与深度学习》04 《AIGC重塑教育》05 《通用人工智能》 前言 在2023年&#xff0c;人工智能领域经历了一场前所未有的大爆发&#xff0c;特别是在语言模型领域。新的概念和英文缩写如AIGC、…

Ngnix之反向代理、负载均衡、动静分离

目录 1. Ngnix 1.1 Linux系统Ngnix下载安装 1.2 反向代理 正向代理&#xff08;Forward Proxy&#xff09;&#xff1a; 反向代理&#xff08;Reverse Proxy&#xff09;&#xff1a; 1.3 负载均衡 1.4 动静分离 1. Ngnix Nginx是一个高性能的开源Web服务器&#xff0…

设备运维管理系统,设备列表管理,设备拓扑图关系图,告警日志运维

个人主页&#xff1a; 左本Web3D&#xff0c;更多案例预览请点击》 在线案例 个人简介&#xff1a;专注Web3D使用ThreeJS实现3D效果技巧和学习案例 &#x1f495; &#x1f495;积跬步以至千里&#xff0c;致敬每个爱学习的你。喜欢的话请三连&#xff0c;有问题请私信或者加微…

C# 图解教程 第5版 —— 第19章 枚举器和迭代器

文章目录 19.1 枚举器和可枚举类型19.2 IEnumerator 接口19.3 IEnumerable 接口19.4 泛型枚举接口19.5 迭代器19.5.1 迭代器块19.5.2 使用迭代器来创建枚举器19.5.3 使用迭代器来创建可枚举类型 19.6 常见迭代器模式19.7 产生多个可枚举类型19.8 将迭代器作为属性19.9 迭代器的…

【vSphere | VM】虚拟机自定义规范Ⅳ —— 使用虚拟机自定义规范创建 Linux 和 Windows VM

目录 5. 使用虚拟机自定义规范创建VM5.1 Linux 虚拟机示例Rocky Linux 9.2&#xff08;1&#xff09;克隆虚拟机&#xff08;2&#xff09;模板部署虚拟机 5.2 Windows 虚拟机示例Windows 10&#xff08;1&#xff09;克隆虚拟机&#xff08;2&#xff09;模板部署 Windows 10 …

恒创科技:云服务器怎么买才便宜有优惠

随着云计算技术的不断发展&#xff0c;云服务器已经成为企业和个人用户的重要选择。然而&#xff0c;在购买云服务器时&#xff0c;价格和优惠成为了很多用户关注的焦点。那么&#xff0c;如何购买云服务器才能获得更优惠的价格呢&#xff1f;下面就为大家介绍一些购买云服务器…