力扣
题干:
解题报告:
我做麻烦了 ,其实两遍dfs就可以了,第一遍算高度,第二遍算深度,并且在第二次dfs的时候可以直接维护出答案数组:ans[i]代表删掉i为根节点的子树后树的高度。
其实主要的思想就是子树问题可以简化成根节点的问题,即把整个子树的信息都汇聚到根节点上,然后把这个信息作为参数延续在dfs中传递就可以了。
我的做法比较麻烦,首先基于一个结论:同层删除一个节点之后,答案肯定在同层的其他节点身上。如果该层之后这一个节点,那答案肯定在父节点身上。所以按层维护,然后找答案就可以了。multiset维护来找最大值。
AC代码:
/*** 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 {
public:multiset<int> ss[100005];int d[100005], mx[100005], fa[100005];int dfs(TreeNode* root, int dep, int father) {if(root == nullptr) return dep-1;d[root->val] = dep;fa[root->val] = father;int l = dfs(root->left, dep+1, root->val);int r = dfs(root->right, dep+1, root->val);ss[dep].insert(max(l,r));mx[root->val] = max(l,r);return max(l,r);}vector<int> treeQueries(TreeNode* root, vector<int>& queries) {vector<int> ans;dfs(root, 0, root->val);for(auto q : queries) {int dep = d[q];int flag = 0;if(ss[dep].size() == 1) {flag = 1;dep--;}if(flag == 0) {ss[dep].erase(ss[dep].find(mx[q]));ans.push_back(*--ss[dep].end());ss[dep].insert(mx[q]); } else {int father = fa[q];ss[dep].erase(ss[dep].find(mx[father]));ss[dep].insert(d[father]);ans.push_back(*--ss[dep].end());ss[dep].insert(mx[father]); ss[dep].erase(ss[dep].find(d[father]));}}return ans;}
};