Tree AVL二进制堆(平衡测试)
我试图实现一个测试,如果一棵树是AVL树或不使用prolog 我已经做了一个高度测试,这对于我目前为止所做的测试来说是有效的,但是我的平衡测试仍然不够有力 这是我迄今为止的工作:Tree AVL二进制堆(平衡测试),tree,prolog,heap,balance,tree-balancing,Tree,Prolog,Heap,Balance,Tree Balancing,我试图实现一个测试,如果一棵树是AVL树或不使用prolog 我已经做了一个高度测试,这对于我目前为止所做的测试来说是有效的,但是我的平衡测试仍然不够有力 这是我迄今为止的工作: avl('Branch'(LeftBranch,RightBranch)) :- height(LeftBranch,H1), height(RightBranch,H2), abs(H1-H2) =< 1. 为什么我的代码对某些树不求值 这是我基于balanace树测试的线程,我确实尝试了他在评
avl('Branch'(LeftBranch,RightBranch)) :-
height(LeftBranch,H1),
height(RightBranch,H2),
abs(H1-H2) =< 1.
为什么我的代码对某些树不求值
这是我基于balanace树测试的线程,我确实尝试了他在评论中发布的树,但我失败了,有什么想法吗?代码似乎还行,也许缩进数据并使用与评论中相同的函数可以帮助:
t :- avl(b(l(1),
b(l(2),
b(l(3),
b(l(4),
l(5)
)
)
)
),
b(l(6),
b(l(7),
b(l(8),
b(l(9),
l(10)
)
)
)
)
).
avl(LeftBranch,RightBranch) :-
height(LeftBranch,H1),
height(RightBranch,H2),
abs(H1-H2) =< 1.
height(l(_),1).
height(b(LeftBranch,RightBranch),H) :-
height(LeftBranch,H1),
height(RightBranch,H2),
H is max(H1,H2)+1.
AVL树的每个分支首先应该是AVL树本身。只有当这是真的,你才应该比较高度 chac答案中的树显然是不平衡的,但是您的代码认为它是正确的。事实并非如此 然后是打字错误。如果使用短名称,则不太可能发生
avl_height(b(L,R),H) :-
avl_height(L,h(H1)),
avl_height(R,h(H2)),
abs(H1-H2) =< 1, !,
H3 is 1 + max(H1,H2), H=h(H3).
avl_height(b(_,_),not).
avl_height(l(_),h(1)).
avl_高度(b(L,R),H):-
平均高度(L,h(H1)),
avl_高度(R,h(H2)),
abs(H1-H2)=<1!,
H3为1+最大值(H1,H2),H=H(H3)。
avl_高度(b(u,u),非)。
avl_高度(l(u),h(1))。
我的孩子还没有喝早茶。是的,我明白了。还有。@WillNess你在代码中找到错误了吗?它在特定的树上仍然是真的。甚至把它写在纸上,看它是否平衡,帖子中的评论只是误导。但至少在我的论文中它看起来是一个不平衡的事实。有点困惑什么是h()?难道不可能只检查一个参数吗?我建议只发送树以避免人为错误。我们从第二个参数中的avl_height/2
中得到两种可能的结果。它要么是h(X)
,其中X
是它的高度,要么是not
,表示此树不是AVL。AVL树几乎是平衡的。我在同一棵树上做这件事,我得到的输出和我在一棵平衡的树上做的一样。T=b(b(l(1),b(l(2),b(l(3),b(l(4),l(5‘‘‘)’)),b(l(6),b(l(7),b(l(8),b(l(l(9),l(10‘‘‘‘‘‘‘‘)’)))))),N=h(1),这是我输入我们正在评估的树时得到的输出。@预计我修正了一个输入错误。
?- t.
true.
avl_height(b(L,R),H) :-
avl_height(L,h(H1)),
avl_height(R,h(H2)),
abs(H1-H2) =< 1, !,
H3 is 1 + max(H1,H2), H=h(H3).
avl_height(b(_,_),not).
avl_height(l(_),h(1)).