C++---树形DP---树的中心(每日一道算法2023.7.19)
发布人:shili8
发布时间:2025-02-08 05:27
阅读次数:0
**树形DP——树的中心**
每日一道算法2023.7.19**题目描述**
给定一个二叉树,每个节点都有一个权值。求出这个树的中心,即最远离叶子结点的点。
**示例**
输入:[1,2,4,null,5,3]
输出:[4,2]
**解决方案**
我们可以使用树形动态规划(Tree DP)来解决这个问题。首先,我们需要定义一个函数 `dfs` 来计算每个节点的距离和权值。
cppstruct TreeNode { int val; TreeNode *left; TreeNode *right; }; class Solution { public: vector<int> getCenter(TreeNode* root) { if (!root) return {}; // 计算根节点的距离和权值 int dist =0, sum = root->val; dfs(root,1, dist, sum); // 找到最远离叶子结点的点 vector<int> res; findCenter(root, dist, res); return res; } private: void dfs(TreeNode* node, int depth, int& dist, int& sum) { if (!node) return; // 更新距离和权值 dist = max(dist, depth); sum += node->val; // 递归计算子节点的距离和权值 dfs(node->left, depth +1, dist, sum); dfs(node->right, depth +1, dist, sum); } void findCenter(TreeNode* node, int dist, vector<int>& res) { if (!node) return; // 如果当前点是最远离叶子结点的点,添加到结果中 if (dist == getDist(node)) res.push_back(node->val); // 递归找出子节点是否是最远离叶子结点的点 findCenter(node->left, dist +1, res); findCenter(node->right, dist +1, res); } int getDist(TreeNode* node) { if (!node) return INT_MAX; // 计算当前点到叶子结点的距离 int left = getDist(node->left), right = getDist(node->right); return max(left, right) +1; } };
**注释**
* `dfs` 函数用于计算每个节点的距离和权值。它递归地访问树中的每个结点,并更新距离和权值。
* `findCenter` 函数用于找到最远离叶子结点的点。它递归地访问树中的每个结点,并检查是否是最远离叶子结点的点。
* `getDist` 函数用于计算当前点到叶子结点的距离。
**时间复杂度**
* `dfs` 函数的时间复杂度为 O(n),其中 n 是树中的结点数。
* `findCenter` 函数的时间复杂度为 O(n)。
* `getDist` 函数的时间复杂度为 O(n)。
**空间复杂度**
* `dfs` 函数的空间复杂度为 O(h),其中 h 是树的高度。
* `findCenter` 函数的空间复杂度为 O(h)。
* `getDist` 函数的空间复杂度为 O(1)。