LCP 52. 二叉搜索树染色
欢迎各位勇者来到力扣城,本次试炼主题为「二叉搜索树染色」。
每位勇士面前设有一个二叉搜索树的模型,模型的根节点为 root
,树上的各个节点值均不重复。初始时,所有节点均为蓝色。现在按顺序对这棵二叉树进行若干次操作, ops[i] = [type, x, y]
表示第 i
次操作为:
type
等于 0 时,将节点值范围在 [x, y]
的节点均染蓝type
等于 1 时,将节点值范围在 [x, y]
的节点均染红请返回完成所有染色后,该二叉树中红色节点的数量。
注意:
x
、y
值定出现在二叉搜索树节点中示例 1:
输入:
root = [1,null,2,null,3,null,4,null,5], ops = [[1,2,4],[1,1,3],[0,3,5]]
输出:
2
解释: 第 0 次操作,将值为 2、3、4 的节点染红; 第 1 次操作,将值为 1、2、3 的节点染红; 第 2 次操作,将值为 3、4、5 的节点染蓝; 因此,最终值为 1、2 的节点为红色节点,返回数量 2 {:width=230px}
示例 2:
输入:
root = [4,2,7,1,null,5,null,null,null,null,6]
ops = [[0,2,2],[1,1,5],[0,4,5],[1,5,7]]
输出:
5
解释: 第 0 次操作,将值为 2 的节点染蓝; 第 1 次操作,将值为 1、2、4、5 的节点染红; 第 2 次操作,将值为 4、5 的节点染蓝; 第 3 次操作,将值为 5、6、7 的节点染红; 因此,最终值为 1、2、5、6、7 的节点为红色节点,返回数量 5 {:width=230px}
提示:
1 <= 二叉树节点数量 <= 10^5
1 <= ops.length <= 10^5
ops[i].length == 3
ops[i][0]
仅为 0
or 1
0 <= ops[i][1] <= ops[i][2] <= 10^9
0 <= 节点值 <= 10^9
原站题解
python3 解法, 执行用时: 776 ms, 内存消耗: 72 MB, 提交时间: 2023-10-08 23:43:30
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def getNumber(self, root: Optional[TreeNode], ops: List[List[int]]) -> int: def dfs(node): if node: yield from dfs(node.left) yield node.val yield from dfs(node.right) ans = 0 nums = [num for num in dfs(root)] for tp, x, y in ops[::-1]: ix, iy = bisect_left(nums, x), bisect_right(nums, y) - 1 if ix <= iy: if tp: ans += iy - ix + 1 nums = nums[:ix] + nums[iy + 1:] return ans
golang 解法, 执行用时: 480 ms, 内存消耗: 30.3 MB, 提交时间: 2023-10-08 23:43:10
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func getNumber(root *TreeNode, ops [][]int) (ans int) { nums := []int{} var dfs func(node *TreeNode) dfs = func(node * TreeNode) { if node != nil { dfs(node.Left) nums = append(nums, node.Val) dfs(node.Right) } } dfs(root) for i := len(ops) - 1; i >= 0; i-- { ix, iy := bisectLeft(nums, ops[i][1]), bisectRight(nums, ops[i][2]) - 1 if ix <= iy { if ops[i][0] == 1 { ans += iy - ix + 1 } tmp := nums[iy + 1:] nums = nums[:ix] nums = append(nums, tmp...) } } return } func bisectLeft(nums []int, target int) int { l, r := 0, len(nums) for l < r { mid := (l + r) >> 1 if nums[mid] >= target { r = mid } else { l = mid + 1 } } return l } func bisectRight(nums []int, target int) int { l, r := 0, len(nums) for l < r { mid := (l + r) >> 1 if nums[mid] > target { r = mid } else { l = mid + 1 } } return l }
golang 解法, 执行用时: 572 ms, 内存消耗: 21.3 MB, 提交时间: 2023-10-08 23:42:45
/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func getNumber(root *TreeNode, ops [][]int) int { ans := 0 n := len(ops) var dfs func(root *TreeNode) dfs = func(root *TreeNode) { if root == nil { return } for i := n - 1; i >= 0; i-- { if root.Val >= ops[i][1] && root.Val <= ops[i][2] { // fmt.Println(root.Val) ans += ops[i][0] break } } dfs(root.Left) dfs(root.Right) } dfs(root) return ans }
python3 解法, 执行用时: 688 ms, 内存消耗: 72.1 MB, 提交时间: 2023-10-08 23:42:17
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def getNumber(self, root: Optional[TreeNode], ops: List[List[int]]) -> int: def getnext(p: Optional[TreeNode]): if not p: return [] return getnext(p.left) + [p.val] + getnext(p.right) nums = getnext(root) ans = 0 for op in ops[::-1]: l = bisect.bisect_left(nums,op[1]) r = bisect.bisect(nums,op[2]) - 1 if l > r: continue if op[0]==1: ans += r - l + 1 nums[l:r+1] = [] return ans
javascript 解法, 执行用时: 392 ms, 内存消耗: 103.5 MB, 提交时间: 2023-10-08 23:41:08
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @param {number[][]} ops * @return {number} */ var getNumber = function(root, ops) { // 从最后的操作往前冲,遇到红色的直接加1并结束,遇到蓝色的直接结束 // 想象成坐标轴,最后的操作在最下面,往上冲,遇到的第一个颜色如果是红色+1,蓝色结束。 const check = (node) => { for (let i = ops.length - 1; i >= 0; i--) { if (ops[i][0] === 1 && node >= ops[i][1] && node <= ops[i][2]) { ans++; // 遇到红色,加1结束 break; } if (ops[i][0] === 0 && node >= ops[i][1] && node <= ops[i][2]) { break; // 遇到蓝色,失败结束 } } } const dfs = (root) => { if (!root) return; dfs(root.left); check(root.val); dfs(root.right); } let ans = 0; dfs(root); return ans; };
cpp 解法, 执行用时: 888 ms, 内存消耗: 292.9 MB, 提交时间: 2023-10-08 23:40:50
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { set<int> st; void dfs(TreeNode *node) { if (node == nullptr) return; st.insert(node->val); dfs(node->left); dfs(node->right); } public: int getNumber(TreeNode* root, vector<vector<int>>& ops) { dfs(root); int ans = 0; for (int i = (int) ops.size() - 1; i >= 0; i--) { while (true) { auto it = st.lower_bound(ops[i][1]); if (it == st.end() || (*it) > ops[i][2]) break; st.erase(it); if (ops[i][0]) ans++; } } return ans; } };