力扣:二叉树着色游戏(DFS详解)
有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同。
游戏从「一号」玩家开始(「一号」玩家为红色,「二号」玩家为蓝色),最开始时,
「一号」玩家从 [1, n] 中取一个值 x(1 <= x <= n);
「二号」玩家也从 [1, n] 中取一个值 y(1 <= y <= n)且 y != x。
「一号」玩家给值为 x 的节点染上红色,而「二号」玩家给值为 y 的节点染上蓝色。
之后两位玩家轮流进行操作,每一回合,玩家选择一个他之前涂好颜色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色。
如果当前玩家无法找到这样的节点来染色时,他的回合就会被跳过。
若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ️。
现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true;若无法获胜,就请返回 false。
获胜的关键是要取得更多的节点数量。假设玩家1取了x节点,则我们可以认为玩家2可以取不包含x及其子树的节点、x的左节点和x的右节点。
1、令x的左节点数量为left,右节点数量为right。half为一半节点数量
left>half 或 right>half; // 必赢
left == half 或 right == half; // 必输
half<=left+right<2*half; // 玩家1的节点数加上父节点及其本身已经超过half,必输
left+right<half; // 只要选择x节点的父节点即可
int left = 0;
int right = 0;
int m;
public boolean btreeGameWinningMove(TreeNode root, int n, int x) {
m = x;
int half = n/2;
dfs(root);
// 此时的left和right应经更新
if ( left > half || right > half || (left+right) < half) {
return true;
} else {
return false;
}
}
public int dfs(TreeNode node) {
int leftNum = 0;
int rightNum = 0;
if (node.left != null) {
leftNum = dfs(node.left);
}
if (node.right != null) {
rightNum = dfs(node.right);
}
if (node.val == m) {
left = leftNum;
right = rightNum;
}
return leftNum+rightNum+1;
}
这里我们主要看一下dfs的具体应用。
可以看出dfs方法中给出了搜索的具体操作:在给定node情况下,对node节点的左右节点分别搜索,记录个数。记住这里面用到了递归的思想,在进行一系列左节点搜索结束后倒叙返回搜索上一节点的右节点。(要想清楚递归的真正迭代操作)首先从0-->n递归,递归结束后向上返回到第n-1递归进行判断,以此类推至第0次。当其中某个节点值为m,则返回m节点处的左右节点个数。
力扣:二叉树着色游戏(DFS详解)的更多相关文章
- BFS和DFS详解
BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...
- 《Android游戏开发详解》一1.7 控制流程第1部分——if和else语句
本节书摘来异步社区<Android游戏开发详解>一书中的第1章,第1.7节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.7 ...
- c++排序二叉树的出现的私有函数讨论,以及二叉树的删除操作详解
c++排序二叉树的出现的私有函数讨论, 以及二叉树的删除操作详解 标签(空格分隔): c++ 前言 我在c++学习的过程中, 最近打了一个排序二叉树的题目,题目中出现了私有函数成员,当时没有理解清楚这 ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- unity3d 获取游戏对象详解
原文地址:http://www.xuanyusong.com/archives/2768 我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能 ...
- Unity获取游戏对象详解
我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我.我看很多人喜欢在类里面去保存GameObject对象.解决G ...
- UDK游戏打包详解
转自:http://blog.sina.com.cn/s/blog_944177030100ycki.html 安装完的udk目录下有4个主要的文件夹 Binaries -这个文件夹包含游戏的exe程 ...
- 图论-欧拉图-欧拉回路-Euler-Fluery-Hierholzer-逐步插入回路法-DFS详解-并查集
欧拉图性质: 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数): 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个奇数度的结点: 3.有向连通图D是欧拉图,当且仅当该图 ...
- JavaScript贪食蛇游戏制作详解
之前闲时开发过一个简单的网页版贪食蛇游戏程序,现在把程序的实现思路写下来,供有兴趣同学参考阅读. 代码的实现比较简单,整个程序由三个类,一组常量和一些游戏逻辑以外的初始化和控制代码组成,总共400多行 ...
随机推荐
- [开源] .Net orm FreeSql 1.5.0 最新版本(番号:好久不见)
废话开头 这篇文章是我有史以来编辑最长时间的,历时 4小时!!!原本我可以利用这 4小时编写一堆胶水代码,真心希望善良的您点个赞,谢谢了!! 很久很久没有写文章了,上一次还是在元旦发布 1.0 版本的 ...
- js-实现多列布局(瀑布流)
本文是使用面向对象的思想实现多列布局(瀑布流).当然,使用面向过程也能实现,具体效果图和案例如下: 具体实现代码如下: <!DOCTYPE html> <html lang=&quo ...
- async/await 内幕【译文】
C# Under the Hood: async/await 原文地址:https://www.markopapic.com/csharp-under-the-hood-async-await/ 前言 ...
- eatwhatApp开发实战(十一)
之前我们实现了点击item项跳转activity,接下来我们再其基础上添加参数的传递. 在MainActivity里面的onItemClick()中: String name = shopList.g ...
- pandas读写csv,并增加一列
为读取csv,并DataFrame增加一列,再自由组合列并保存到csv文件: import pandas as pd sourceFile='d:\person.csv' #person.csv包括i ...
- parrot os安装vmware pro
转载https://www.linuxtechi.com/install-vmware-workstation-14-debian-9/ Open the terminal and execute t ...
- Activity组件暴露导致本地拒绝服务
这几天团队打算一起学习Android App漏洞挖掘方面的知识,于是乎拿了一个app当测试例子,争取在上面找到漏洞.在学习过程中发现Android四大组件的安全性还是占有较大的比重,另外比较关心的是数 ...
- 学习scrapy框架爬小说
一.背景:近期学习python爬虫技术,感觉挺有趣.由于手动自制爬虫感觉效率低,了解到爬虫界有先进的工具可用,尝试学学scrapy爬虫框架的使用. 二.环境:centos7,python3.7,scr ...
- VNC CentOS 7 远程工具,VNC CentOS 7 远程工具推荐!
IIS7服务器管理工具是一款能够在Windows和Linux系统下进行VNC使用的软件!它能够成为VNC的客户端,帮助操作者完成VNC的相关命令!同时,它还能够作为FTP的操作客户端,实现FTP的传输 ...
- Rocket - config - Configs
https://mp.weixin.qq.com/s/z2gUYuYQAHQCa_5HZcBszw 介绍各个配置项的组织方式. 参考链接: https://docs.qq.com/sheet/ ...