验证红黑树
Verify a red black tree
我想验证二叉树是否是红黑树。
我需要检查的一些属性是:
- 根是黑色
- 不能有2个连续的红色节点。
- 需要添加空节点作为叶节点,颜色取黑色
- 从叶子到根的每条路径都包含相同数量的黑色节点
不知何故,我的测试用例都通过了,但我确定我没有实现上面的数字 4。
如何检查从根到 Empty
(结束)的任何深度是否具有相同数量的黑色节点?
我将我的树定义为:
type 'a tree = Empty | T of color * 'a tree * 'a * 'a tree
我的代码只是将当前树与一些错误情况和 return 错误相匹配。否则,调用左右分支的递归函数。
let rec good_RB t = match t with
| Empty -> true
| T (R, T (R, _, _, _), _, _)
| T (R , _, _, T (R, _, _, _)
-> false
| T (_, lft, _, rgt) -> good_RB lft && good_RB rgt
嗯,你需要保留一个计数器:
let rec nb_blacks_lftmst acc = function
| Empty -> acc
| T (c, lft, _, _) ->
nb_blacks_lftmst (match c with R -> acc | B -> acc + 1) lft
let good_count = function
| Empty -> true
| T (_, lft, _, rgt) ->
let cpt = nb_blacks_lftmst 0 lft in
let rec aux acc = function
| Empty -> acc = cpt
| T (c, lft, _, rgt) ->
let acc = match c with R -> acc | B -> acc + 1 in
aux acc lft && aux acc rgt
in
aux 0 lft && aux 0 rgt
像这样的东西应该有用。 (在我的回答中,最左边的路径被访问了两次,第一次是获取witness counter,第二次是因为不想写复杂的代码不访问第二次)
我想验证二叉树是否是红黑树。 我需要检查的一些属性是:
- 根是黑色
- 不能有2个连续的红色节点。
- 需要添加空节点作为叶节点,颜色取黑色
- 从叶子到根的每条路径都包含相同数量的黑色节点
不知何故,我的测试用例都通过了,但我确定我没有实现上面的数字 4。
如何检查从根到 Empty
(结束)的任何深度是否具有相同数量的黑色节点?
我将我的树定义为:
type 'a tree = Empty | T of color * 'a tree * 'a * 'a tree
我的代码只是将当前树与一些错误情况和 return 错误相匹配。否则,调用左右分支的递归函数。
let rec good_RB t = match t with
| Empty -> true
| T (R, T (R, _, _, _), _, _)
| T (R , _, _, T (R, _, _, _)
-> false
| T (_, lft, _, rgt) -> good_RB lft && good_RB rgt
嗯,你需要保留一个计数器:
let rec nb_blacks_lftmst acc = function
| Empty -> acc
| T (c, lft, _, _) ->
nb_blacks_lftmst (match c with R -> acc | B -> acc + 1) lft
let good_count = function
| Empty -> true
| T (_, lft, _, rgt) ->
let cpt = nb_blacks_lftmst 0 lft in
let rec aux acc = function
| Empty -> acc = cpt
| T (c, lft, _, rgt) ->
let acc = match c with R -> acc | B -> acc + 1 in
aux acc lft && aux acc rgt
in
aux 0 lft && aux 0 rgt
像这样的东西应该有用。 (在我的回答中,最左边的路径被访问了两次,第一次是获取witness counter,第二次是因为不想写复杂的代码不访问第二次)