diff --git a/Readme.md b/Readme.md index 6a97bae6c..712df090b 100644 --- a/Readme.md +++ b/Readme.md @@ -237,6 +237,7 @@ [2277.Closest-Node-to-Path-in-Tree](https://github.com/wisdompeak/LeetCode/tree/master/Tree/2277.Closest-Node-to-Path-in-Tree) (H-) [2313.Minimum-Flips-in-Binary-Tree-to-Get-Result](https://github.com/wisdompeak/LeetCode/tree/master/Tree/2313.Minimum-Flips-in-Binary-Tree-to-Get-Result) (H) [2322.Minimum-Score-After-Removals-on-a-Tree](https://github.com/wisdompeak/LeetCode/tree/master/Tree/2322.Minimum-Score-After-Removals-on-a-Tree) (H-) +[2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries](https://github.com/wisdompeak/LeetCode/tree/master/Tree/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries) (M+) * ``Path in a tree`` [543.Diameter-of-Binary-Tree](https://github.com/wisdompeak/LeetCode/tree/master/Tree/543.Diameter-of-Binary-Tree) (M) [124.Binary-Tree-Maximum-Path-Sum](https://github.com/wisdompeak/LeetCode/tree/master/Tree/124.Binary-Tree-Maximum-Path-Sum) (M) diff --git a/Tree/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries.cpp b/Tree/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries.cpp new file mode 100644 index 000000000..08ee36acc --- /dev/null +++ b/Tree/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries.cpp @@ -0,0 +1,48 @@ +/** + * Definition for a binary tree node. + * struct TreeNode { + * int val; + * TreeNode *left; + * TreeNode *right; + * TreeNode() : val(0), left(nullptr), right(nullptr) {} + * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + * }; + */ +class Solution { + unordered_map>d2h; + int depth[100005]; + int height[100005]; +public: + vector treeQueries(TreeNode* root, vector& queries) + { + dfs_height(root, 0); + for (auto& [d, hs] : d2h) + sort(hs.rbegin(), hs.rend()); + + vectorrets; + for (int node: queries) + { + int d = depth[node]; + int h = height[node]; + if (d2h[d].size()==1) + rets.push_back(d - 1); + else if (d2h[d][0] == h) + rets.push_back(d2h[d][1] + d); + else + rets.push_back(d2h[d][0] + d); + } + return rets; + + } + + int dfs_height(TreeNode* node, int d) + { + if (node==NULL) return -1; + int h = max(dfs_height(node->left, d+1), dfs_height(node->right, d+1)) + 1; + d2h[d].push_back(h); + depth[node->val] = d; + height[node->val] = h; + return h; + } +}; diff --git a/Tree/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries/Readme.md b/Tree/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries/Readme.md new file mode 100644 index 000000000..b0c1525b2 --- /dev/null +++ b/Tree/2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries/Readme.md @@ -0,0 +1,7 @@ +### 2458.Height-of-Binary-Tree-After-Subtree-Removal-Queries + +我们定义一个节点的height表示从它到叶子节点的最大距离,depth表示从它到root的距离。 + +我们移除node节点对应的子树后,剩下的树的高度其实就取决于与它同depth的节点的height。所以我们将所有处在同depth的节点的height都提前收集好,那么就很容易找到其他子树的最大height。 + +特别注意,如果某个深度的节点只有一个,那么将其移除后,剩下树的最大高度就是该节点的depth-1.

AltStyle によって変換されたページ (->オリジナル) /