对树的操作,特别理解递归的好处。

//对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的
//另一点结束而形成的路径,而路径的长度就是经过的点的数量(包括起点和终点)。而这里我们所说的单色路径自然就是只经过一种颜色的点的路径。
//你需要找到这棵树上最长的单色路径。
//给定一棵二叉树的根节点(树的点数小于等于300,请做到O(n)的复杂度),请返回最长单色路径的长度。
//这里的节点颜色由点上的权值表示,权值为1的是黑点,为0的是白点。 //这题用动态规划来求解。需要用到一对引用传值(white和black)来记录每个节点的左右孩子节点的黑白路径长度值传递上来。
//如:lhswhite ,lhsblack ,rhswhite,rhsblack分别表示两个孩子节点的黑白最长路径长度
//分两类情况:
//(1)当父节点为黑时:其white = 0,black = max(lhsblack + 1, rhsblack + 1),它的最长单色路径长度为lhsblack + rhsblack + 1;
//(2)当父节点为白时:其black = 0,white = max(lhswhite + 1, rhswhite + 1),它的最长单色路径长度为lhswhite + rhswhite + 1; struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(nullptr), right(nullptr) {
}
};
//也不知道为什么就是不AC,和下面的有区别吗????
class LongestPath {
public:
int result = ; int findPath(TreeNode* root) {
// write code here
if (root==nullptr)
{
return ;
}
int white = , black = ;
path(root,white,black);
return result;
}
void path(TreeNode* root, int &white, int &balck)
{
if (root->right == nullptr&&root->right == nullptr)
{
if (root->val == )
{
balck = ; white = ;
}
else
{
balck = ; white = ;
}
}
else
{
int lblack = , lwhite = ;
int rblack = , rwhite = ;
if (root->right != nullptr)
{
path(root->right, rwhite, rblack);
}
if (root->left != nullptr)
{
path(root->left, lwhite, lblack);
}
if (root->val == )
{
if (lblack + rblack + > result)
result = lblack + rblack + ;
white = ;
balck = (lblack + ) > (rblack + ) ? (lblack + ) : (rblack + );
}
else
{
if (rwhite + lwhite + > result)
result = rwhite + lwhite + ;
balck = ;
white = (lwhite + ) > (rwhite + ) ? (lwhite + ) : (rwhite + );
}
}
}
}; class LongestPath {
public:
int ret = ;
int findPath(TreeNode* root) {
// write code here
int white = , black = ;
dfsPath(root, white, black);
return ret;
}
void dfsPath(TreeNode* root, int &white, int &black){
if (root->left == nullptr && root->right == nullptr){
if (root->val == ){
white = ; black = ;
}
else{
white = ; black = ;
}
}
else{
int lhswhite = , lhsblack = ;
int rhswhite = , rhsblack = ;
if (root->left != nullptr) dfsPath(root->left, lhswhite, lhsblack);
if (root->right != nullptr) dfsPath(root->right, rhswhite, rhsblack);
if (root->val == ){
if (lhsblack + rhsblack + > ret) ret = lhsblack + rhsblack + ;
white = ;
black = lhsblack + > rhsblack + ? lhsblack + : rhsblack + ;
}
else{
if (lhswhite + rhswhite + > ret) ret = lhswhite + rhswhite + ;
black = ;
white = lhswhite + > rhswhite + ? lhswhite + : rhswhite + ;
}
}
}
};

参考:http://www.cnblogs.com/chenhuan001/p/5420368.html。找规律!

//现在A和B在玩一个游戏,这个游戏首先给了他们很多珠子,珠子有两种颜色,一种蓝色,一种黄色,我们假定两种珠子都有无限多。
//A需要选择n颗珠子(n为奇数),然后由B串成一串项链(顺序由B确定, 这里的项链也就是一个环)。假如在最后串成的项链中,
//A能够找到两个不同位置的蓝色珠子,并在这两处把这个项链断开成两段,其中一段恰好长度为(n + 1) / 2那么A就胜利了,
//注意这里为整数截断除法且这个长度是不包括选出的两颗珠子的。现在请你计算出A至少要选择多少颗蓝色珠子,才能保证无论B怎么串,
//他都能获胜。举个例子,当A选了7颗珠子,其中有3颗蓝珠子,那么如果B串的项链为"蓝蓝红红红红蓝",则A能获胜,
//若B串的项链为"蓝蓝红红蓝红红",则A不能获胜。
//
//输入描述 :
//给定一个整数n,为A要选出的珠子颗数.
//
//
//输出描述 :
// 请返回A至少要选的蓝珠子颗数。
//
// 输入例子 :
//7
//
//输出例子 :
// class Chain {
public:
int findK(int n) {
// write code here
if (n % == ) return n / ;
else return (n + ) / ;
}
};

二叉树单色路径最长&&穿珠子的更多相关文章

  1. 二叉树单色路径最长&&穿珠子

    对树的操作,特别理解递归的好处. //对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的 //另一点结束而形成的路径,而路 ...

  2. 二叉树系列 - 二叉树里的最长路径 例 [LeetCode] Binary Tree Maximum Path Sum

    题目: Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start ...

  3. [LeetCode] Path Sum III 二叉树的路径和之三

    You are given a binary tree in which each node contains an integer value. Find the number of paths t ...

  4. [LeetCode] Path Sum IV 二叉树的路径和之四

    If the depth of a tree is smaller than 5, then this tree can be represented by a list of three-digit ...

  5. LintCode-376.二叉树的路径和

    二叉树的路径和 给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径. 一个有效的路径,指的是从根节点到叶节点的路径. 样例 给定一个二叉树,和 目标值 = 5: 返回: [      ...

  6. Java实现求二叉树的路径和

    题: 解: 这道题考的是如何找出一个二叉树里所有的序列. 我的思路是先从根节点开始遍历,找出所有的子节点,因为每个子节点只有一个父节点,再根据每个子节点向上遍历找出所有的序列,再判断序列的总和. 这样 ...

  7. [LeetCode] 666. Path Sum IV 二叉树的路径和 IV

    If the depth of a tree is smaller than 5, then this tree can be represented by a list of three-digit ...

  8. [LeetCode] Path Sum 二叉树的路径和

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  9. lintcode:二叉树的路径和

    题目 给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径. 一个有效的路径,指的是从根节点到叶节点的路径. 解题 下面有个小bug 最后比较的时候是叶子节点为空,左右都有叶子结点,所 ...

随机推荐

  1. C#添加日志

    /// <summary> /// 记录日志 /// </summary> /// <param name="msg"></param&g ...

  2. 给 Gradle 配置国内的 Maven 仓库,提高 jar 包下载速度。

    最近使用 gradle 跑一些 spring 的示例,在下载一些 jar 的时候速度特别慢,因为是访问的国外的 maven 仓库. 开源中国提供了国内的 maven 库,所以可以在 gradle 里设 ...

  3. Windows API 进程状态信息函数

    这里的进程状态信息函数主要分为两类,一类是PS(PROCESS STATUS HELPER) API,另外一类是Th(TOOL HELP) API. 话说第一次遇到这个ToolHelp函数时我在看&l ...

  4. TFSAPI

    Team Foundation Server (TFS)工具的亮点之一是管理日常工作项, 工作项如Bug, Task,Task Case等. 使用TFS API编程访问TFS服务器中的工作项, 步骤如 ...

  5. Oracle EBS 寄售业务总结

    总述: 须通过一揽子采购协议(BPA)明确采购方与供应商之间的寄售关系,及各种协议条款: 通过来源补充规则(Sourcing Rules)明确物料的供应商以及分配规则: 通过合格供应商列表(ASL)明 ...

  6. 关于结构化BOM的思考

    参加了今天的"自主生产音箱类产品BOM结构问题"(即非采购而是制造的音箱)会议,我发现大家在会议上呈现的产品结构对生产计划的层级需求已上升到5层的需求了,又找段会胜要了各位前期就此 ...

  7. [HDOJ1043]Eight(康托展开 BFS 打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 八数码问题,因为固定了位置所以以目标位置开始搜索,把所有情况(相当于一个排列)都记录下来,用康托 ...

  8. 《OD大数据实战》Kafka入门实例

    官网: 参考文档: Kafka入门经典教程 Kafka工作原理详解 一.安装zookeeper 1. 下载zookeeper-3.4.5-cdh5.3.6.tar.gz 下载地址为: http://a ...

  9. Css中光标,DHTML,缩放的使用

    Css中光标的使用: 属性名称                属性值                                         说明cursor                 ...

  10. POJ 2236 (简单并查集) Wireless Network

    题意: 有n个电脑坏掉了,分别给出他们的坐标 有两种操作,可以O x表示修好第x台电脑,可以 S x y表示x y是否连通 两台电脑的距离不超过d便可连通,两台电脑是连通的可以直接连通也可以间接通过第 ...