最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

2023-05-03:給你一棵 二叉樹 的根節(jié)點 root ,樹中有 n 個節(jié)點 每個節(jié)點都可以被分配

2023-05-03 21:11 作者:福大大架構師每日一題  | 我要投稿

2023-05-03:給你一棵 二叉樹 的根節(jié)點 root ,樹中有 n 個節(jié)點

每個節(jié)點都可以被分配一個從 1 到 n 且互不相同的值

另給你一個長度為 m 的數組 queries

你必須在樹上執(zhí)行 m 個 獨立 的查詢,其中第 i 個查詢你需要執(zhí)行以下操作:

從樹中 移除 以 queries[i] 的值作為根節(jié)點的子樹

題目所用測試用例保證 queries[i] 不 等于根節(jié)點的值。

返回一個長度為 m 的數組 answer ,其中 answer[i] 是執(zhí)行第 i 個查詢后樹的高度。

注意:

查詢之間是獨立的,所以在每個查詢執(zhí)行后,樹會回到其 初始 狀態(tài)。

樹的高度是從根到樹中某個節(jié)點的 最長簡單路徑中的邊數 。

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

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

答案2023-05-03:

大體過程:

1.定義和初始化全局變量

  • ??使用常量?MAXN?定義數組大小。

  • ??定義用于深度優(yōu)先搜索的四個數組?dfn、deep、size、maxl、maxr?和一個計數器?n,保存每個節(jié)點的編號、深度、子樹大小、左右子樹的最大深度。

2.定義深度優(yōu)先搜索函數?dfs

  • ??用一個計數器?i?記錄當前節(jié)點的編號,并將其存儲到數組?dfn?中。

  • ??將當前節(jié)點的深度?h?存儲到數組?deep?中。

  • ??將當前節(jié)點的子樹大小初始化為 1,存儲到數組?size?中。

  • ??如果當前節(jié)點存在左孩子,則遞歸調用?dfs?函數,并將當前節(jié)點的子樹大小加上其左孩子的子樹大小。

  • ??如果當前節(jié)點存在右孩子,則遞歸調用?dfs?函數,并將當前節(jié)點的子樹大小加上其右孩子的子樹大小。

3.在主函數中創(chuàng)建一棵二叉樹?root?和一個查詢數組?queries。

4.對于每個查詢?queries[i],執(zhí)行以下操作:

  • ??計算以?queries[i]?為根節(jié)點的子樹編號范圍,即?dfn[queries[i]]?到?dfn[queries[i]]+size[dfn[queries[i]]]-1。

  • ??將該范圍內所有節(jié)點的深度保存到數組?maxl?中,并計算其前綴最大值。

  • ??將該范圍內所有節(jié)點的深度保存到數組?maxr?中,并計算其后綴最大值。

  • ??計算左右子樹的最大深度,取其中的較大值作為刪除子樹后樹的高度。

  • ??將結果保存到答案數組?ans?中。

5.返回答案數組。

注意:在每次查詢中,需要重新計算左右子樹的最大深度,因為每次查詢都會修改樹的結構。

時間復雜度:

在?dfs?函數中,對于每個節(jié)點最多訪問一次,因此該函數的時間復雜度為 O(n),其中 n 是二叉樹的節(jié)點數。

在?treeQueries?函數中,需要處理 $m$ 個查詢,對于每個查詢需要計算左右子樹的最大深度,時間復雜度為 O(n),因此總時間復雜度為 O(mn)。

空間復雜度:

在 C++ 中,數組和變量的空間占用量是固定的,因此空間復雜度主要取決于遞歸調用時堆棧的空間占用量。由于最壞情況下二叉樹可能退化成一個鏈表,因此堆??臻g的最大使用量為 O(n),其中 n 是二叉樹的節(jié)點數。

除了堆??臻g之外,還需要使用常量大小的額外空間來存儲全局變量和臨時變量,因此總空間復雜度為 O(n)。

go完整代碼如下:

package?main

import?(
????"fmt"
)

type?TreeNode?struct?{
????Val???int
????Left??*TreeNode
????Right?*TreeNode
}

const?MAXN?=?100010

var?dfn?[MAXN]int
var?deep?[MAXN]int
var?size?[MAXN]int
var?maxl?[MAXN]int
var?maxr?[MAXN]int
var?n?int

func?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>

#define?MAXN?100010

struct?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;
}

在這里插入圖片描述


2023-05-03:給你一棵 二叉樹 的根節(jié)點 root ,樹中有 n 個節(jié)點 每個節(jié)點都可以被分配的評論 (共 條)

分享到微博請遵守國家法律
安福县| 手机| 广河县| 木里| 枣阳市| 汉阴县| 宁陕县| 鄂尔多斯市| 新密市| 巩义市| 砀山县| 隆德县| 怀集县| 宜丰县| 高邮市| 日喀则市| 横山县| 横山县| 彰武县| 高碑店市| 喀喇| 巴东县| 双鸭山市| 梁平县| 平远县| 建始县| 黄浦区| 佛冈县| 朝阳市| 思南县| 巴彦淖尔市| 阜康市| 博兴县| 石城县| 沙洋县| 休宁县| 三都| 云霄县| 樟树市| 洛浦县| 德兴市|