交大oj-1046-二哥的吊灯 C++ 解题报告
1.解题思路
每个节点属性有编号,左右孩子和是否是红灯,用一个vector储存二叉树,涂色时使用递归进行中序遍历,得到某一个节点root下中序遍历的所有节点,将对应的灯涂成红色。回答女友提问时将节点root下的节点遍历一遍,计算其中红灯的数量即可。(这个时候不一定要用中序遍历)。
2.我踩过的坑
这道题不知道抽什么风,我提交时一直显示超时,找不到原因。后来在网上找到了和自己算法思路一样的解答,不同的是他采用的是scanf()
和 printf()
,然后他就过了。。。
3.解题代码
#include <iostream>
#include <vector>
using namespace std;
struct node {
int left;
int right;
bool isred;
node(bool isred = false) :isred(isred) {};
};
vector<node> tree;
vector<int> nums;
int number = 0;
void middle_order(int root)
{
if (root) {
middle_order(tree[root].left);
nums.emplace_back(root);
middle_order(tree[root].right);
}
}
void color(int root, int x)
{
// get value Y
nums.clear();
middle_order(root); // 中序遍历
int y = nums.size();
// 涂色
int number = x % (nums.size()); // count from one
tree[nums[number]].isred = true;
}
int getColorNumber(int root)
{
if (root) {
return getColorNumber(tree[root].left) + tree[root].isred + getColorNumber(tree[root].right);
}
else {
return 0;
}
}
int main()
{
int n, p, q;
scanf("%d%d%d", &n, &p, &q);
tree = vector<node>(n + 1, node(false));
// 建立 二叉树
int x, left, right;
for (int i = 0; i < n; i++) {
scanf("%d%d%d", &x, &left, &right);
tree[x].left = left;
tree[x].right = right;
}
// 开始 涂色
int root;
for (int i = 0; i < p; i++) {
scanf("%d%d", &root, &x);
color(root, x);
}
for (int i = 0; i < q; i++) {
scanf("%d", &root);
printf("%d\n", getColorNumber(root));
}
return 0;
}
知识源于积累,没有人天生聪慧