首页 >资管 > > 正文

2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配

哔哩哔哩 2023-05-03 21:17:42

2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点

每个节点都可以被分配一个从 1 到 n 且互不相同的值

另给你一个长度为 m 的数组 queries


(资料图片)

你必须在树上执行 m 个 独立 的查询,其中第 i 个查询你需要执行以下操作:

从树中 移除 以 queries[i] 的值作为根节点的子树

题目所用测试用例保证 queries[i] 不 等于根节点的值。

返回一个长度为 m 的数组 answer ,其中 answer[i] 是执行第 i 个查询后树的高度。

注意:

查询之间是独立的,所以在每个查询执行后,树会回到其 初始 状态。

树的高度是从根到树中某个节点的 最长简单路径中的边数 。

输入:root = [5,8,9,2,1,3,7,4,6], queries = [3,2,4,8]。

输出:[3,2,3,2]。

答案2023-05-03:

大体过程:

1.定义和初始化全局变量

• 使用常量 MAXN定义数组大小。

• 定义用于深度优先搜索的四个数组 dfndeepsizemaxlmaxr和一个计数器 n,保存每个节点的编号、深度、子树大小、左右子树的最大深度。

2.定义深度优先搜索函数 dfs

• 用一个计数器 i记录当前节点的编号,并将其存储到数组 dfn中。

• 将当前节点的深度 h存储到数组 deep中。

• 将当前节点的子树大小初始化为 1,存储到数组 size中。

• 如果当前节点存在左孩子,则递归调用 dfs函数,并将当前节点的子树大小加上其左孩子的子树大小。

• 如果当前节点存在右孩子,则递归调用 dfs函数,并将当前节点的子树大小加上其右孩子的子树大小。

3.在主函数中创建一棵二叉树 root和一个查询数组 queries

4.对于每个查询 queries[i],执行以下操作:

• 计算以 queries[i]为根节点的子树编号范围,即 dfn[queries[i]]到 dfn[queries[i]]+size[dfn[queries[i]]]-1

• 将该范围内所有节点的深度保存到数组 maxl中,并计算其前缀最大值。

• 将该范围内所有节点的深度保存到数组 maxr中,并计算其后缀最大值。

• 计算左右子树的最大深度,取其中的较大值作为删除子树后树的高度。

• 将结果保存到答案数组 ans中。

5.返回答案数组。

注意:在每次查询中,需要重新计算左右子树的最大深度,因为每次查询都会修改树的结构。

时间复杂度:

在 dfs函数中,对于每个节点最多访问一次,因此该函数的时间复杂度为 O(n),其中 n 是二叉树的节点数。

在 treeQueries函数中,需要处理 $m$ 个查询,对于每个查询需要计算左右子树的最大深度,时间复杂度为 O(n),因此总时间复杂度为 O(mn)。

空间复杂度:

在 C++ 中,数组和变量的空间占用量是固定的,因此空间复杂度主要取决于递归调用时堆栈的空间占用量。由于最坏情况下二叉树可能退化成一个链表,因此堆栈空间的最大使用量为 O(n),其中 n 是二叉树的节点数。

除了堆栈空间之外,还需要使用常量大小的额外空间来存储全局变量和临时变量,因此总空间复杂度为 O(n)。

go完整代码如下:

package mainimport (    "fmt")type TreeNode struct {    Val   int    Left  *TreeNode    Right *TreeNode}const MAXN = 100010var dfn [MAXN]intvar deep [MAXN]intvar size [MAXN]intvar maxl [MAXN]intvar maxr [MAXN]intvar n intfunc treeQueries(root *TreeNode, queries []int) []int {    n = 0    dfs(root, 0)    for i := 1; i <= n; i++ {        maxl[i] = max(maxl[i-1], deep[i])    }    maxr[n+1] = 0    for i := n; i >= 1; i-- {        maxr[i] = max(maxr[i+1], deep[i])    }    m := len(queries)    ans := make([]int, m)    for i := 0; i < m; i++ {        leftMax := maxl[dfn[queries[i]]-1]        rightMax := maxr[dfn[queries[i]]+size[dfn[queries[i]]]]        ans[i] = max(leftMax, rightMax)    }    return ans}func dfs(head *TreeNode, h int) {    i := n + 1    dfn[head.Val] = i    deep[i] = h    size[i] = 1    n = i    if head.Left != nil {        dfs(head.Left, h+1)        size[i] += size[dfn[head.Left.Val]]    }    if head.Right != nil {        dfs(head.Right, h+1)        size[i] += size[dfn[head.Right.Val]]    }}func max(a, b int) int {    if a > b {        return a    }    return b}func main() {    root := &TreeNode{        Val: 5,        Left: &TreeNode{            Val: 8,            Left: &TreeNode{                Val:   2,                Left:  nil,                Right: nil,            },            Right: &TreeNode{                Val:   9,                Left:  nil,                Right: nil,            },        },        Right: &TreeNode{            Val: 3,            Left: &TreeNode{                Val:   1,                Left:  nil,                Right: nil,            },            Right: &TreeNode{                Val: 7,                Left: &TreeNode{                    Val:   4,                    Left:  nil,                    Right: nil,                },                Right: &TreeNode{                    Val:   6,                    Left:  nil,                    Right: nil,                },            },        },    }    queries := []int{3, 2, 4, 8}    ans := treeQueries(root, queries)    fmt.Println("The query results are:", ans)}

c完整代码如下:

#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAXN 100010struct TreeNode {    int val;    struct TreeNode* left;    struct TreeNode* right;};int dfn[MAXN];int deep[MAXN];int size[MAXN];int maxl[MAXN];int maxr[MAXN];int n;int max0(int a, int b) {    return a > b ? a : b;}void dfs(struct TreeNode* head, int h);int* treeQueries(struct TreeNode* root, int* queries, int queriesSize, int* returnSize);int main() {    struct TreeNode node9 = { 9, NULL, NULL };    struct TreeNode node8 = { 8, NULL, &node9 };    struct TreeNode node2 = { 2, NULL, NULL };    struct TreeNode node4 = { 4, NULL, NULL };    struct TreeNode node1 = { 1, NULL, NULL };    struct TreeNode node6 = { 6, NULL, NULL };    struct TreeNode node7 = { 7, &node4, &node6 };    struct TreeNode node3 = { 3, &node1, &node7 };    struct TreeNode node5 = { 5, &node8, &node3 };    struct TreeNode* root = &node5;    int queries[] = { 3, 2, 4, 8 };    int queriesSize = sizeof(queries) / sizeof(int);    int returnSize = 0;    int* ans = treeQueries(root, queries, queriesSize, &returnSize);    printf("The query results are: [");    for (int i = 0; i < returnSize; i++) {        if (i > 0) {            printf(", ");        }        printf("%d", ans[i]);    }    printf("]\n");    free(ans);    return 0;}void dfs(struct TreeNode* head, int h) {    int i = ++n;    dfn[head->val] = i;    deep[i] = h;    size[i] = 1;    if (head->left != NULL) {        dfs(head->left, h + 1);        size[i] += size[dfn[head->left->val]];    }    if (head->right != NULL) {        dfs(head->right, h + 1);        size[i] += size[dfn[head->right->val]];    }}int* treeQueries(struct TreeNode* root, int* queries, int queriesSize, int* returnSize) {    n = 0;    dfs(root, 0);    int i;    for (i = 1; i <= n; i++) {        maxl[i] = max0(maxl[i - 1], deep[i]);    }    maxr[n + 1] = 0;    for (i = n; i >= 1; i--) {        maxr[i] = max0(maxr[i + 1], deep[i]);    }    int* ans = (int*)malloc(queriesSize * sizeof(int));    for (i = 0; i < queriesSize; i++) {        int leftMax = maxl[dfn[queries[i]] - 1];        int rightMax = maxr[dfn[queries[i]] + size[dfn[queries[i]]]];        ans[i] = max0(leftMax, rightMax);    }    *returnSize = queriesSize;    return ans;}

c++完整代码如下:

#include<iostream>#include<vector>using namespace std;struct TreeNode {    int val;    TreeNode* left;    TreeNode* right;    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}};const int MAXN = 100010;int dfn[MAXN];int deep[MAXN];int size0[MAXN];int maxl[MAXN];int maxr[MAXN];int n;void dfs(TreeNode* head, int h) {    int i = ++n;    dfn[head->val] = i;    deep[i] = h;    size0[i] = 1;    if (head->left != nullptr) {        dfs(head->left, h + 1);        size0[i] += size0[dfn[head->left->val]];    }    if (head->right != nullptr) {        dfs(head->right, h + 1);        size0[i] += size0[dfn[head->right->val]];    }}vector<int> treeQueries(TreeNode* root, vector<int>& queries) {    n = 0;    dfs(root, 0);    for (int i = 1; i <= n; i++) {        maxl[i] = max(maxl[i - 1], deep[i]);    }    maxr[n + 1] = 0;    for (int i = n; i >= 1; i--) {        maxr[i] = max(maxr[i + 1], deep[i]);    }    int m = (int)queries.size();    vector<int> ans(m);    for (int i = 0; i < m; i++) {        int leftMax = maxl[dfn[queries[i]] - 1];        int rightMax = maxr[dfn[queries[i]] + size0[dfn[queries[i]]]];        ans[i] = max(leftMax, rightMax);    }    return ans;}int main() {    TreeNode node9(9);    TreeNode node8(8);    node8.right = &node9;    TreeNode node2(2);    TreeNode node4(4);    TreeNode node1(1);    TreeNode node6(6);    TreeNode node7(7);    node7.left = &node4;    node7.right = &node6;    TreeNode node3(3);    node3.left = &node1;    node3.right = &node7;    TreeNode node5(5);    node5.left = &node8;    node5.right = &node3;    vector<int> queries{ 3, 2, 4, 8 };    auto ans = treeQueries(&node5, queries);    cout << "The query results are: [";    for (int i = 0; i < ans.size(); i++) {        if (i > 0) {            cout << ", ";        }        cout << ans[i];    }    cout << "]" << endl;    return 0;}

上一篇:现场直击!联勤整治行动发现了……|环球滚动 下一篇:最后一页
x
推荐阅读

2023-05-03:给你一棵 二叉树 的根节点 root ,树中有 n 个节点 每个节点都可以被分配

2023-05-03

现场直击!联勤整治行动发现了……|环球滚动

2023-05-03

中年女人穿衣误区:阔腿裤显瘦,裙子越花越显年轻!你中了没

2023-05-03

奇尔维尔:输球让我们感到受伤和愤怒,我们必须审视自己

2023-05-03

凤台县气象局发布雷电黄色预警【III级/较重】【2023-05-03】

2023-05-03

大数据看“五一”,热门目的地和出发地,成都均上榜|资讯推荐

2023-05-03

今热点:加拿大大温哥华地区一小型飞机降落时触到皮卡车坠毁

2023-05-03

前沿资讯!中钞国鼎基准银价今天多少一克(2023年05月03日)

2023-05-03

2022年报和2023Q1点评:营收利润大超预期,未来将迎来强劲复苏

2023-05-03

安徽省应急管理厅发布暴雨和强对流天气防御预警|环球今亮点

2023-05-03

2-3!又被绝杀!大满贯得主5战4负提前出局!颜丙涛4连胜掌控命运_动态焦点

2023-05-03

金山云美股跌10.7% 全球球精选

2023-05-03

南方医科大学珠江医院药工招聘启事

2023-05-03

天天即时看!疑“拉萨客栈杀人案”受害者家属发声 听听他怎么说!!

2023-05-03

科技赋能“中国建造”

2023-05-03

运动用品 多层次需求促创新 世界简讯

2023-05-03

河南发布区域地质灾害气象风险黄色预警

2023-05-03

环球新资讯:纳斯达克中国金龙指数跌超4%,金山云(KC.O)、万国数据(GDS.O)跌超8%,拼多多(PDD.O)跌6.8%,哔哩哔哩(BILI.O)跌近6%,蔚来汽车(NIO.N)跌5.4%,京东(JD.O)跌4.5%

2023-05-03

天天通讯!2023 年 4 月新势力交付排行榜

2023-05-03

周期拐点将至 AMDQ1业绩或为芯片行业带来复苏信号?

2023-05-02

巴克莱:下调Capri Holdings(CPRI.US)评级|全球简讯

2023-05-02

返程高峰即将开启!风雨“返岗”,收下这份攻略再出发 今亮点

2023-05-02

掌中之物结局(掌中之物简介)

2023-05-02

环球资讯:暗殿骑士武器增幅什么属性_暗殿骑士武器

2023-05-02

Met gala 红毯太尴尬!蔡徐坤被认成王嘉尔,红毯蟑螂乱爬

2023-05-02

当前头条:xman金钟国尹恩惠那集开始的_xman金钟国

2023-05-02

每日讯息!横贯是什么意思_横贯的意思

2023-05-02

二丙二醇甲醚醋酸酯商品报价动态(2023-05-02)

2023-05-02

05月01日新房成交198套;涨价房源105套-世界今日报

2023-05-02

保险交了两年不想交了可以退吗?退保怎么退?

2023-05-02

世界百事通!葛定昆_关于葛定昆的简介

2023-05-02

【全球速看料】鄂州新港路(重载车专用通道)6月全面完工

2023-05-02

9472米!亚洲最深井在塔里木盆地开钻

2023-05-02

全球快看:贝达药业(300558):贝福替尼获批在即 创新管线加速推进

2023-05-02

天天热点!咱家的汽车也能“氢”起来

2023-05-02

环球百事通!黑龙江煤炭智慧化生产效益明显

2023-05-02

【谷歌损失一员猛将 “AI教父”离开】被称为“AI教父”的Geoffrey Hinton认为AI可以“获得比任何个体生物都多得多的知识”,他说人工智能时代的到来比他之前想象的要早。他说:“我离开谷歌是为了谈论AI的风险,而不必考虑这对谷歌的影响。”-天天即时看

2023-05-02

《塞尔达传说:王国之泪》容量降至16G 仍为NS第一方游戏之最|每日简讯

2023-05-02

环球关注:潘星谊

2023-05-02

世界简讯:预计6月底!西安人将喝上安康汉江水!

2023-05-01

2022新风机十大品牌排行榜_新风机哪个牌子好 最资讯

2023-05-01

【全球新要闻】我发现互联网工作的性价比还在持续走低,没看到好转的迹象

2023-05-01

天天短讯!【游客镜头里的贵州】冰激凌里的热辣茅台古镇

2023-05-01

全球动态:时政微视频丨不惰者 众善之师

2023-05-01

win7分辨率怎么调最佳_win7分辨率怎么调

2023-05-01

寿险转长护险试点今日启动!申请办理需要注意这些内容→_世界看点

2023-05-01

天天最资讯丨亚洲最深油气井在塔里木盆地开钻

2023-05-01

即将启动!绍兴这些区域已列入拆迁规划

2023-05-01

2023全国游泳赛冠军赛开赛!张雨霏报足六个单项,徐嘉余低调回归 世界即时

2023-05-01

英雄杀画地为牢判定_英雄杀画地为牢_环球微头条

2023-05-01

天天热头条丨丁晖调研重点项目建设工作

2023-05-01

中央宣传部、全国总工会联合发布2023年“最美职工”先进事迹 环球要闻

2023-05-01

第133届广交会第三期展会明日启幕

2023-05-01

孙楠歌名_孙楠什么歌好听-新视野

2023-05-01

早孕测试最佳时间是多久_早孕测试最佳时间

2023-04-30

焦点报道:龙岗区首届台湾青年市集“开张”啦!

2023-04-30

雷竞技资讯:为帮TES复仇BLG高强度训练!100%胜率势必干翻越南队

2023-04-30

资讯:她连续21年,手握方向盘过五一劳动节

2023-04-30

点击乐谱_点击乐2

2023-04-30

手机比较:苹果iPhone 14 Pro Max与小米13至尊 天天播资讯

2023-04-30

认知水平越低,人越固执|动态焦点

2023-04-30

全球即时:及时用车《“迎五一佳节 筑安全长城”优秀司机表彰暨安全生产动员会》活动圆满成功!

2023-04-30

宁德时代回应原材料价格下跌:不存在大幅减值风险

2023-04-30

今亮点!FOF基金首季调仓仍以均衡配置为主,卫星策略新增计算机和医药

2023-04-30

【世界速看料】干木耳3年了还能吃吗(干木耳放了三四年还能吃吗)

2023-04-30

小米13 Ultra现在有多火?雷军肯定笑得合不拢嘴了吧 天天快消息

2023-04-30

51%的千禧一代会根据雇主的重返办公室计划考虑离职

2023-04-30

静安区中华新路一小区起火 消防部门迅速扑灭 环球聚看点

2023-04-30

儿化音教学视频 儿化音 世界热点

2023-04-30

福建省龙岩市安全教育平台入口(福建省龙岩市安全教育平台)

2023-04-30

全球快消息!苹果无线鼠标_关于苹果无线鼠标的简介

2023-04-30

供电部门“体检”景区 确保用电安全-天天看热讯

2023-04-30

devote to翻译_devote to

2023-04-30

焦点速递!书包带子怎么穿图片_书包带子怎么穿图解

2023-04-30

人大代表的具体名额由什么规定?_人大代表的具体名额由什么规定-今日热讯

2023-04-29

动态焦点:安阳市经济运行实现首季开门红 地区生产总值增速居全省第一位

2023-04-29

【时快讯】2023石家庄汽车文化节E5馆,智己LS7来了!

2023-04-29

重庆生育服务证办理对象哪些?生育服务证办理材料

2023-04-29

视点!最新:农行存款利率上调,三年期利率高达3.12%,想存款的有福了

2023-04-29

全球观热点:optimized是什么意思中文 optimized是什么意思

2023-04-29

天天即时看!你一句春不晚,我就到了真长春

2023-04-29

动态焦点:中信建投:国有出版从防御品种到进攻品种 出版行业仍被明显低估

2023-04-29

3月销量再度“暴跌”,雷萨克斯还能撑多久?

2023-04-29

最新资讯:工信部官员:加强顶层设计,加快元宇宙产业创新发展

2023-04-29

天天热资讯!集体入“红榜”!詹姆斯率三军爆发,湖人125-85淘汰灰熊晋级

2023-04-29

6名厅官聚餐豪饮7瓶白酒致1死!他们为什么会结在一起?履历曝光→

2023-04-29

世界微资讯!西安高新区举办“名校+”办学成果展示活动

2023-04-29

家门口的公益集市让居民感觉暖暖的|热推荐

2023-04-29

速读:长江防总:预计主汛期长江流域降水量总体偏少 旱重于涝

2023-04-29

飞驰人生张弛怎么活下来的_飞驰人生张弛最后死

2023-04-29

早安北京0429:大风蓝警中,最高温25℃;请收好这份出行攻略

2023-04-29

全球动态:惠普1005打印机驱动官方下载_为什么惠普打印机驱动安装不

2023-04-29

世界消息!五一景区调查:实名制购票让“黄牛党”基本消失

2023-04-29

环球最资讯丨穿越火线图标如何点亮(穿越火线最新图标怎么点亮)

2023-04-29

浦发银行一季度营收480.79亿元,下降3.85%,长三角存贷余额位列股份行第一 焦点关注

2023-04-29

神鬼传奇手游辅助_神鬼传奇外挂_世界信息

2023-04-29

股票行情快报:博闻科技(600883)4月28日主力资金净卖出36.46万元|世界时讯

2023-04-29

美国西雅图市发生枪击事件 3人受伤|世界播资讯

2023-04-29

方外之人_关于方外之人介绍|全球热资讯

2023-04-28

劳动创美好 实践酿芬芳 郑州大学实验小学举行劳动技能大赛-天天新资讯

2023-04-28