简单
A - Almost Balanced Tree(DFS)
传送门
题意:定义一棵权值平衡二叉树:节点的总权值是以它为根节点的子树的权值和,一棵二叉树是否权值平衡当且仅当其任意一个节点的左右儿子总权值差值不超过 1,没有儿子视为儿子节点的权值是 0。现在让你构造一棵权值平衡的二叉树,这棵树每一个点的权值只能是 1 或者 2,给定两个数 n 和 m,n 是 1 的数量,m 是 2 的数量,输出任意一种答案即可,不能构造时输出 -1。
做法:这题有很多做法,有一种稍微好写的做法,给定 n 和 m,那么当前可分配的资源值的是:n + m * 2,递归去给每个节点赋值,优先赋值 2。
若 m 不为 0,则赋值后,可用资源值为 n + (m - 1) * 2,然后给左右儿子分配资源,分配时尽可能的令两边平衡(这个操作挺有点麻烦),如果无法平衡,标记,递归结束后输出 -1。
若 m 为 0,赋值后,可用资源值为 n - 1,后面和上一种操作一样。
中等
较难
C - Color the Tree(DFS)
这道题个人认为比较难,但实际上可能很简单
传送门
题意:有一棵树根节点是红色,其他节点是绿色的,当这棵树满足以下两点:① 根节点为红色 ② 当某个点是红色且该点到根节点的最短路径上所有点也是红色。那么这棵树是美丽的,你可以对这棵树进行一项操作:更改树中某一节点的颜色(如果红就变绿,如果绿就变红),你的每次操作都要保证这棵树是美丽的且操作后的树没有在之前操作时出现过(如果把每次操作后的树都存下来,那么每棵树都是独一无二的),给定树形结构,根节点永远是 1,问最大操作数,且按顺序输出修改的节点编号?
做法:对于一条链形的树,修改顺序是顺着下来的
如果有两条链 a 和 b,长度分别是 x 和 y,算上树的初始状态,树的状态总数量是 x * y 种,所以操作数就是 x * y - 1,那么问题是如何输出正确的顺序?
b0 + a1 , a2 , a3 … ax
b1 + ax , ax-1 … a2 , a1
b2 + a1 , a2 , a3 … ax
,
b0 是 根节点,直接忽略即可,每次修改后添加另一条链的一个点然后倒着将红点变绿点,所以输出是:a[1~ x] , b1 , a[x ~ 1] , b2 , a[1 ~ x] , …
两条链的做法已知,多条链复杂的树形结构处理方法其实也一样,用 dfs 将之前的所有链合并当作新链与其他链合并。
这题对我来说非常抽象,主要是我太菜了