📌  相关文章
📜  给定树的求和树中任何两个加权节点之间的最小差(1)

📅  最后修改于: 2023-12-03 15:11:40.487000             🧑  作者: Mango

求解给定树的求和树中任何两个加权节点之间的最小差

简介

给定一棵树,对于每个节点,用该节点及其子树中所有节点的权值之和作为该节点的权值。这棵树就被称为求和树。

我们需要求出任意两个加权节点之间的最小差。这个问题可以转化为先对求和树进行一次 DFS 遍历,然后再求最小的相邻节点之间的差值。

算法
class Solution {
public:
    vector<int> diff;
    vector<bool> visited;

    void dfs(TreeNode* node) {
        visited[node->val] = true;

        // 找到和当前节点最近的已访问节点
        int d = 0;
        for (int i = node->val + 1; i < visited.size(); i++) {
            if (visited[i]) {
                d = abs(node->val - i);
                break;
            }
        }
        diff[node->val] = d;

        // 利用已访问节点更新答案
        for (auto v : node->children) {
            dfs(v);
            diff[node->val] = min(diff[node->val], diff[v->val]);
        }
    }

    vector<int> smallestDifference(TreeNode* root) {
        int n = root->val;
        visited.resize(n+1, false);
        diff.resize(n+1, INT_MAX);

        dfs(root);
        return diff;
    }
};
复杂度

时间复杂度:O(n^2),其中 n 为节点数。每个节点会遍历它之后的所有节点,每轮需要 O(n) 的时间复杂度。

空间复杂度:O(n),其中 n 为节点数。需要额外开销 visited 和 diff 数组,它们的大小都为 n+1。