Leetcode2458-移除子树后的二叉树高度

博客介绍了移除子树后的二叉树高度的求解方法。先求出整颗树的dfs序和各结点深度,将树上询问转化为序列处理,把删除子树变为删除区间,通过前后缀记录最大权值,可O(1)回答询问,时间和空间复杂度均为O(n)。

移除子树后的二叉树高度

解:先求出整颗树的dfs序,同时求出各个结点的深度。通过转化我们把树上的询问变为了序列的处理,深度代表这个点的权值。这样就把删除某颗子树变为了删除某个区间,然后我们只需要在这个区间之外的地方找到最大的权值即可。用前后缀来记录某个结点之前与之后的最大权值,我们就可以O(1)来回答每个询问。

class Solution {
public:
    vector<int> treeQueries(TreeNode* root, vector<int>& queries) {
        int idx=0,h=0;
        vector<int> l,r;
        vector<int> dep({0});//0作为前哨兵
        function<void(TreeNode*,int)> dfs=[&](TreeNode* root,int curh){
            dep.push_back(curh);
            l.resize(max((int)l.size(),root->val+1));
            r.resize(max((int)r.size(),root->val+1));
            l[root->val]=++idx;
            if(root->left) dfs(root->left,curh+1);
            if(root->right) dfs(root->right,curh+1);
            r[root->val]=idx;
        };
        dfs(root,0);
        dep.push_back({0});//0作为后哨兵
        int n=dep.size()-2;
        vector<int> sl(n+2),sr(n+2);//前后缀
        for(int i=1;i<=n;i++) sl[i]=max(sl[i-1],dep[i]);
        for(int i=n;i;i--) sr[i]=max(sr[i+1],dep[i]);
        vector<int> ans;
        for(auto q:queries){
            ans.push_back(max(sl[l[q]-1],sr[r[q]+1]));
        }
        return ans;
    }
};

时间复杂度:O(n)。

空间复杂度:O(n),n为结点个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值