首页 > 其他分享 >Leetcode 6233 -- dfs序

Leetcode 6233 -- dfs序

时间:2022-10-30 17:36:01浏览次数:74  
标签:son -- dfs 节点 int path height Leetcode

题目描述

给定我们一棵树,和一组查询,每个查询给出一个节点,让我们求删除以这个节点为根(包括这个节点)的子树中的所有节点之后(并不是真的删除),剩下的树中节点的最大高度。(树的高度是从根到树中某个节点的 最长简单路径中的边数 。)

思路

对于树的题目,学习到了一种新的算法(思路) -- \(DFS\) 序列
即将树通过 \(DFS\) 序转成序列。
子树里的所有点是 \(DFS\) 序里的一个连续区间。因此本题可以被转化为如下问题:
给定一个序列,每次删除一个连续区间,求序列里剩下的数的最大值。
显然删除一个连续区间后,序列会剩下一个前缀以及一个后缀。
我们预处理前缀 \(max\) 和后缀 \(max\),就能 \(O(1)\) 回答每个询问。复杂度 \(O(n+q)\)。(\(n\)为数中节点数,\(q\) 为查询个数)。

dfs序代码(双百)

class Solution {
public:
    vector<int> treeQueries(TreeNode* root, vector<int>& queries) {
        int height[100010], son[100010];
        int l[100010], r[100010];
        int pos[100010];
        memset(height, 0, sizeof height);
        memset(son, 0, sizeof son);
        vector<int> res, path;
        
        function<int(TreeNode *, int)> dfs = [&](TreeNode *root, int depth) -> int {
            if(root == NULL)    return 0;
            int t = root->val;
            path.push_back(t);
            height[t] = depth;  
            son[t] = 1;
            son[t] += dfs(root->left,  depth + 1);
            son[t] += dfs(root->right, depth + 1);
            return son[t];
        };
        dfs(root, 0);
        int n = path.size();
        l[path[0]] = height[path[0]], r[path[n - 1]] = height[path[n - 1]], pos[path[0]] = 0;
        for(int i = 1, j = n - 2; i < n; i ++ , j -- )
        {
            pos[path[i]] = i;
            l[path[i]] = max(height[path[i]], l[path[i - 1]]);
            r[path[j]] = max(height[path[j]], r[path[j + 1]]);
        }

        // cout << "path: "; for(auto &x : path) cout << x << ' ';   cout << endl;
        // for(auto &x : path) cout << l[x] << ' ';    cout << endl;
        // for(auto &x : path) cout << r[x] << ' ';    cout << endl;
        
        for(auto &x : queries)
        {
            int p = pos[x];
            // cout << "p: " << p << ' ' << p + son[x] << endl;
            // 边界检查
            int lmaxn = (p == 0) ? 0 : l[path[p - 1]];
            int rmaxn = (p + son[x] >= n) ? 0 : r[path[p + son[x]]];
            int maxn = max(lmaxn, rmaxn);
            res.push_back(maxn);
        }

        return res;
    }
};
/* 1. 预处理每个节点到根节点的距离(高度)
   2. 预处理每个节点的孩子节点的个数
*/

标签:son,--,dfs,节点,int,path,height,Leetcode
From: https://www.cnblogs.com/ALaterStart/p/16841723.html

相关文章

  • RSA算法详解
    基础知识RSA设计\(m^{ed}\equiv1\:(mod\:n)\)RSA密钥生成第一步,随机选择两个不相等的质数p和q。如61和53。(质数越大越安全。)第二步,计算p和q的乘积n。把61和5......
  • C++——智能指针unique_ptr
    独占指针:unique_ptrunique_ptr在任何给定的时刻,只能有一个指针管理内存当指针超出作用域时,内存将自动释放该类型指针不可Copy,只可以Move运行结果没有运行delete......
  • JavaScript 使用 Notification 发送系统通知
    使用Notification可以在系统级别发送页面外部显示的桌面通知,即使浏览器在后台运行也可以向用户发出消息检查权限发送通知需要用户授权,通过只读属性Notification.per......
  • 基于Cri-dockerd使用Kubeadm部署Kubernetes1.25集群
    1.前言介绍关于Kuebernetes的部署常用于部署K8s集群的工具和部署方式minikubekubeadm二进制包本文使用kubeadm部署方式K8s集群的部署有多种方式,而使用Kubeadm是......
  • 关于罗技鼠标在m1 mac上卡顿,飘逸的问题
    最近发现公司发的罗技鼠标出现卡顿,漂移的现象,就是滑动的时候,鼠标突然卡了一样,然后出现在另一个地方。以为是鼠标坏了,又买了个新的M720。连接蓝牙的话,不丝滑;优联连接的话......
  • 同样是文件上传,看看大神和菜鸟的实现区别
    大家好,我是可乐。基于电商项目,往往会有很多图片交互,比如海量的商品图片,卖家和买家的聊天图片,用户个人信息图片等等假如你作为公司电商项目技术负责人,你会如何去实现图片交互......
  • 10的第三次周报
    目录json补充正则匹配字符组特殊符号量词网络爬虫第三方模块第三方模块的下载安装exceljson补充取消中文转义ensuer_ascii=False正则匹配直接匹配字符直接填写需要......
  • Illustrator 2023 for mac/win(ai2023)中文
    大名鼎鼎的AdobeIllustrator2023(AI2023)简称AI,是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。该软件主要应用于印刷出版、海报书籍排版、专业插画、多媒......
  • 隐藏技能之双端队列
    //双端队列,两边usingnamespacestd;typedefcharElemType;#include<time.h>#include<stdlib.h>#include<iostream>#defineMaxSize30classDequeType{......
  • 10.30周日,复盘
    复盘一级标题二级标题三级标题c编程小感悟迭代的使用当一个变量名,不断出现新值替代旧值时,此时该变量就是迭代变量。写代码最忌讳的:一步到位初学者很忌讳一下把代......