OCAML中2-3-4树拆分为小型节点的转换实现问题
原实现核心问题
- 递归逻辑走偏:原代码仅在当前根节点拆分后的新结构外层套递归,完全没有对节点携带的所有原始子树做前置递归遍历,导致递归永远无法深入树的下层分支
- 分支匹配缺失:单元素的Node_1分支被归入通配逻辑直接抛错,只要遍历到子层的Node_1节点就会中断运行,无法完成全树处理
- 类型逻辑错位:原转换结果仍属于ab234类型,没有实现到带颜色的ab类型的映射,不符合2-3-4树到红黑结构的转换目标
修正实现
严格按照递归遍历顺序,先转换所有子树,再做当前节点的映射拆分,覆盖所有构造分支,匹配标准2-3-4树到红黑结构的映射规则:
let rec eclat = function | Vide -> Vide (* 单元素2-节点:映射为黑节点,前置转换两个子树 *) | Node_1 (v, left, right) -> let t_left = eclat left in let t_right = eclat right in Node (v, Black, t_left, t_right, Vide) (* 双元素3-节点:拆分为红节点挂载到黑节点下,前置转换三个子树 *) | Node_2 (v_low, v_high, t_low, t_mid, t_high) -> let t_low' = eclat t_low in let t_mid' = eclat t_mid in let t_high' = eclat t_high in let red_sub = Node (v_low, Red, t_low', t_mid', Vide) in Node (v_high, Black, red_sub, t_high', Vide) (* 三元素4-节点:中间元素为黑节点,左右元素为红子节点,前置转换四个子树 *) | Node_3 (v_low, v_mid, v_high, t_low, t_lmid, t_rmid, t_high) -> let t_low' = eclat t_low in let t_lmid' = eclat t_lmid in let t_rmid' = eclat t_rmid in let t_high' = eclat t_high in let red_left = Node (v_low, Red, t_low', t_lmid', Vide) in let red_right = Node (v_high, Red, t_rmid', t_high', Vide) in Node (v_mid, Black, red_left, red_right, Vide)
实现特性:所有子节点都在构造当前层结构前完成递归转换,不存在仅处理根节点的问题;全部分支覆盖无遗漏,不会触发无意义的
failwith中断;颜色赋值严格遵循2-3-4树的映射规则,转换结果符合带颜色ab结构的类型要求。
内容的提问来源于stack exchange,提问作者Hicham
相关产品推荐
相关产品推荐

