跳到主要内容

2458.移除子树后的二叉树高度

链接:2458.移除子树后的二叉树高度
难度:Hard
标签:树、深度优先搜索、广度优先搜索、数组、二叉树
简介:返回一个长度为 m 的数组 answer ,其中 answer[i] 是执行第 i 个查询后树的高度。

题解 1 - cpp

  • 编辑时间:2022-10-30
  • 执行用时:368ms
  • 内存消耗:222.5MB
  • 编程语言:cpp
  • 解法介绍:两次 dfs,第一次统计出每颗子树的高度,第二次记录层高,统计当前子树被移除后的剩余高度,通过最大高度和 level+右子树高度的最大值获取。
class Solution {
public:
typedef pair<int, int> node;
unordered_map<int, node> m;
vector<int> treeQueries(TreeNode* root, vector<int>& queries) {
m[-1] = make_pair(0, 0);
dfs1(root);
dfs2(root);
vector<int> ans;
for (auto &q : queries) ans.push_back(m[q].second);
return ans;
}
int dfs1(TreeNode *node) {
if (node == nullptr) return 0;
int l = dfs1(node->left), r = dfs1(node->right), h = max(l, r) + 1;
m[node->val] = make_pair(h, 0);
return h;
}
void dfs2(TreeNode *node, int level = 0, int curH = 0) {
if (node == nullptr) return;
m[node->val].second = curH;
int l = node->left == nullptr ? -1 : node->left->val,
r = node->right == nullptr ? -1 : node->right->val;
dfs2(node->left, level + 1, max(curH, level + m[r].first));
dfs2(node->right, level + 1, max(curH, level + m[l].first));
}
};