交大oj-1046-二哥的吊灯 C++ 解题报告

交大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;
}

知识源于积累,没有人天生聪慧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值