做算法题目的时候遇到这个题,卡住了好久,在网上找了好多帖子,都没太看懂,尤其是网上最多的解法当中都有一个取余的操作,不太明白什么意思,希望有大神懂得可以指点我一下。
后来找到了一篇帖子,给了我启发。然后结合了一下自己的理解写出了一种解答方式。用的是递归的方式,大致思路如下:**
每次递归返回的信息有两个,blackPlan代表的是以当前节点为根节点,包含当前节点并且包含当前节点的部分中仅含有一个黑色节点的划分方案;whitePlan代表的是以当前节点为根节点,包含当前节点并且包含当前节点的部分中不含有黑色节点的划分方案。(注意这两个划分方案不只是本次的划分方案,是从当前递归次往前所有的划分方案的总数)
之所以要索要向子递归索要这两个信息,也是出于题目设置,题目只要我们把整个树划分,并且划分后的每个部分只能有一个黑色节点。而对于每个当前节点,只有两种情况,即:当前节点为黑色,当前节点为白色。要形成只有一个黑色节点的划分,方式不过是当前节点为黑色,与下面连接的某个子部分的whitePlan组成一个blackPlan;当前节点为白色,与下面的连接的子部分的某个blackPlan组成一个新的blackPlan;当前的节点为白色,与下面的某个字部分的whitePlan组成一个新的whitePlan,以为后面的节点组成blackPlan做准备。
#include <iostream>
#include "vector"
using namespace std;
struct Node{
int no;
int color;
vector<Node*> children;
Node(int n,int c):no(n),color(c){
}
};
struct Info{
int blackPlan;
int whitePlan;
Info(int b,int w):blackPlan(b),whitePlan(w){
}
};
Info cut(Node* node){
if(nod