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

//对于一棵由黑白点组成的二叉树,我们需要找到其中最长的单色简单路径,其中简单路径的定义是从树上的某点开始沿树边走不重复的点到树上的
//另一点结束而形成的路径,而路径的长度就是经过的点的数量(包括起点和终点)。而这里我们所说的单色路径自然就是只经过一种颜色的点的路径。
//你需要找到这棵树上最长的单色路径。
//给定一棵二叉树的根节点(树的点数小于等于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 findPath(TreeNode* root) {
        // write code here
        if (root==nullptr)
        {
            ;
        }
        , black = ;
        path(root,white,black);
        return result;
    }
    void path(TreeNode* root, int &white, int &balck)
    {
        if (root->right == nullptr&&root->right == nullptr)
        {
            )
            {
                balck = ; white = ;
            }
            else
            {
                balck = ; white = ;
            }
        }
        else
        {
            , lwhite = ;
            , rwhite = ;
            if (root->right != nullptr)
            {
                path(root->right, rwhite, rblack);
            }
            if (root->left != nullptr)
            {
                path(root->left, lwhite, lblack);
            }
            )
            {
                 > result)
                    result = lblack + rblack + ;
                white = ;
                balck = (lblack + ) > (rblack + ) ? (lblack + ) : (rblack + );
            }
            else
            {
                 > result)
                    result = rwhite + lwhite + ;
                balck = ;
                white = (lwhite + ) > (rwhite + ) ? (lwhite + ) : (rwhite + );
            }
        }
    }
};

class LongestPath {
public:
    ;
    int findPath(TreeNode* root) {
        // write code here
        , black = ;
        dfsPath(root, white, black);
        return ret;
    }
    void dfsPath(TreeNode* root, int &white, int &black){
        if (root->left == nullptr && root->right == nullptr){
            ){
                white = ; black = ;
            }
            else{
                white = ; black = ;
            }
        }
        else{
            , lhsblack = ;
            , rhsblack = ;
            if (root->left != nullptr) dfsPath(root->left, lhswhite, lhsblack);
            if (root->right != nullptr) dfsPath(root->right, rhswhite, rhsblack);
            ){
                 > ret) ret = lhsblack + rhsblack + ;
                white = ;
                black = lhsblack +  > rhsblack +  ? lhsblack +  : rhsblack + ;
            }
            else{
                 > 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
         == ) ;
        ) / ;
    }
};

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

  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. php mysql_insert_id()

    mysql_insert_id mysql_insert_id()返回给定的 link_identifier中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号.如果没有指 ...

  2. android 更改avd路径

    第一种方法,适合还没有建立 AVD 的情况 即:在计算机右击的属性 选择环境变量,然后添加一个用户的环境变量,名字为 "ANDROID_SDK_HOME”,然后把变量值改为你想将" ...

  3. JVM的相关知识整理和学习--(转载)

    JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构的设计原理.冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操 ...

  4. PowerDesigner15.1创建模型及生成带注释sql操作手册

    转自:http://blog.csdn.net/huiwenjie168/article/details/7824029 一.创建模型 操作:file-->new Model… 快捷键:ctrl ...

  5. HDU 4651 Partition(整数拆分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){    f[0 ...

  6. [HDOJ2602]Bone Collector(01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 裸的... #include <algorithm> #include <io ...

  7. poj 3744 Scout YYF I (矩阵快速幂 优化 概率dp)

    题目链接 分析&&题意来自 : http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710586.html 题意: 在一条不满地雷的 ...

  8. 用VS2005开发WinCE程序调试图文教程

    一.WinCE 模拟器通过ActiveSync 6.1(即Windows Mobile设备中心)连接P 1.启动WinCE模拟器 命令行:  start .\DeviceEmulator.exe WI ...

  9. staging server, source congtrol, deply workflow using git

    web项目开发中,有三个实践对于项目成功是非常重要的: 1. staging servers 2. Version control workflows 3. Tested, repeatable de ...

  10. 随便谈谈alphago与人机大战

    3月16日历时8天的人机大战终于落下帷幕,alphago以4:1的比分击败了当年如日中天的李世石.这个结果让我这个围棋爱好者+计算机爱好者百感交集…… ——一个时代落幕了,一个新的时代开启了. 这次人 ...