力扣 5848. 树上的操作 dfs 模拟

https://leetcode-cn.com/problems/operations-on-tree/
在这里插入图片描述
思路:无聊的模拟题。

class LockingTree {
public:
    LockingTree(vector<int>& vec) {
        parent=vec;
        int n=parent.size();
        tree.resize(n);
        for(int i=1;i<n;i++)
            tree[parent[i]].push_back(i);
    }
    
    bool lock(int num, int user) {
        if(!lockState.count(num))
        {
            lockState[num]=user;
            return 1;
        }
        return 0;
    }
    
    bool unlock(int num, int user) {
        if(lockState.count(num)&&lockState[num]==user)
        {
            lockState.erase(num);
            return 1;
        }
        return 0;
    }
    
    bool upgrade(int num, int user) {
        if(lockState.count(num))
            return 0;
        int father=parent[num];
        while(father>=0)
        {
            if(lockState.count(father))
                return 0;
            father=parent[father];
        }
        vector<int> childs;
        function<void(int)> dfs=[&](int rt) -> void
        {
            if(lockState.count(rt))
                childs.push_back(rt);
            for(int &nxt:tree[rt])
                dfs(nxt);
        };
        dfs(num);
        if(childs.empty())
            return 0;
        lockState[num]=user;
        for(int &child:childs)
            lockState.erase(child);
        return 1;
    }
private: 
    vector<vector<int>> tree;
    vector<int> parent;
    unordered_map<int,int> lockState;
};

/**
 * Your LockingTree object will be instantiated and called as such:
 * LockingTree* obj = new LockingTree(parent);
 * bool param_1 = obj->lock(num,user);
 * bool param_2 = obj->unlock(num,user);
 * bool param_3 = obj->upgrade(num,user);
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值