树的最小子节点-算法题

该博客介绍了一种使用深度优先搜索(DFS)并结合记忆化技术来解决在给定节点关系和价值的情况下,找到树中每个节点的最小子节点的方法。通过递归地遍历树的节点,并比较子节点的值,确定每个节点的最小子节点。输入包括节点关系和对应节点的值,输出是每个节点的最小子节点的值。
摘要由CSDN通过智能技术生成

题意:给定n个节点,标号为0~n-1,每个节点都有一个value值,求这棵树上每个节点的最小子节点;

输入:relation = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], value = [3,2,5,4,6,1,7,0]
输出:[5,5,2,5,4,5,6,7]

输入:relation = [], value = [0]
输出:[0]

题解一:DFS+记忆化

vector<int> minSonNode(vector<vector<int>> &relation, vector<int> &value) {
    int n = value.size();
    vector<vector<int>> g(n);
    for (vector<int> &a : relation)
        g[a[1]].emplace_back(a[0]);
    vector<int> ret(n, -1);
    function<void(int)> dfs = [&](int x) {
        if (ret[x] != -1)
            return;
        ret[x] = x;
        for (int &y : g[x]) {
            dfs(y);
            ret[x] = (value[ret[y]] < value[ret[x]]) ? ret[y] : ret[x];
        }
    };
    for (int i = 0; i < n; ++i)
        dfs(i);
    return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值