# LeetCode 2458. Height of Binary Tree After Subtree Removal Queries https://leetcode.com/problems/height-of-binary-tree-after-subtree-removal-queries/description/ ## 題目大意 題目會給好幾個值裝在 `queries` 裡,我們每次對**原始**的二元樹移除 `queries` 裡的某個值 把移除後的結果裝進陣列 `ans` 中 題目保證不會移除二元樹的 `root` ## 思考 如果我們要計算移除某節點後的樹高,那我們最好的方式就是事先紀錄各個子樹的樹高情況,這樣求樹高會更有效率 我們先紀錄好原始二元樹,再來紀錄移除某點後的二元樹 最後 `treeQueries()` 我們只需要對答案就好 值得提醒的是, `dfs()` 中我們要傳入的 `height` 是要考慮自己兄弟的子樹,也就是 `node->left` 要考慮的是 `node->right` 、 `node->right` 要考慮的是 `node->left` ```cpp! class Solution { public: vector<int> treeQueries(TreeNode *root, vector<int> &queries) { memset(heightAfterRemove, 0, sizeof(heightAfterRemove)); memset(heightInit, 0, sizeof(heightInit)); dfs(root, 0, 0); vector<int> ans; for (int query : queries) { ans.push_back(heightAfterRemove[query]); } return ans; } private: int heightInit[100001]; int heightAfterRemove[100001]; void dfs(TreeNode *node, int level, int height) { if (!node) return; heightAfterRemove[node->val] = height; dfs(node->left, level + 1, max(height, level + getHeight(node->right))); dfs(node->right, level + 1, max(height, level + getHeight(node->left))); } int getHeight(TreeNode *node) { if (!node) return 0; if (heightInit[node->val]) return heightInit[node->val]; return heightInit[node->val] = max(getHeight(node->left), getHeight(node->right)) + 1; } }; ``` 再附上 Go 的參考解答: ```go! func treeQueries(root *TreeNode, queries []int) []int { const maxNodes = 100001 var heightInit [maxNodes]int var heightAfterRemove [maxNodes]int dfs(root, 0, 0, &heightInit, &heightAfterRemove) ans := make([]int, len(queries)) for i, query := range queries { ans[i] = heightAfterRemove[query] } return ans } func dfs(node *TreeNode, level, height int, heightInit, heightAfterRemove *[100001]int) { if node == nil { return } heightAfterRemove[node.Val] = height dfs(node.Left, level+1, int(math.Max(float64(height), float64(level+getHeight(node.Right, heightInit)))), heightInit, heightAfterRemove) dfs(node.Right, level+1, int(math.Max(float64(height), float64(level+getHeight(node.Left, heightInit)))), heightInit, heightAfterRemove) } func getHeight(node *TreeNode, heightInit *[100001]int) int { if node == nil { return 0 } if heightInit[node.Val] != 0 { return heightInit[node.Val] } heightInit[node.Val] = int(math.Max(float64(getHeight(node.Left, heightInit)), float64(getHeight(node.Right, heightInit)))) + 1 return heightInit[node.Val] } ```