Tree AVL二进制堆(平衡测试)

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树或不使用prolog

我已经做了一个高度测试,这对于我目前为止所做的测试来说是有效的,但是我的平衡测试仍然不够有力

这是我迄今为止的工作:

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)).