【问题标题】:AVL Binary Tree - Balanace testAVL 二叉树 - 平衡测试
【发布时间】:2012-08-29 23:46:11
【问题描述】:

我正在尝试测试一棵树是否是 AVL 树或不使用 prolog。

我做了一个高度测试,适用于我目前所做的测试,但我的平衡测试仍然不强。

这是我目前的工作:

avl('Branch'(LeftBranch,RightBranch)) :-
  height(LeftBranch,H1),
  height(RightBranch,H2),
  abs(H1-H2) =< 1.

我基于旧的 stackoverflow 代码编写了这段代码。但它并不适用于所有情况。将包括我的身高代码。我在某个地方犯了一个错误,我确定在哪里可以找到它。

height(leaf(_),1).
height('Branch'(LeftBranch,RightBranch,H) :-
  height(LeftBranch,H1),
  height(RightBranch,H2),
  H is max(H1,H2)+1.

为什么我的代码没有针对某些树进行评估?

Prolog - Balanced tree or not

这是我基于平衡树测试的线程,我确实尝试过他在 cmets 中发布的树,但我失败了,有什么想法吗?

【问题讨论】:

    标签: tree prolog avl-tree balance tree-balancing


    【解决方案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)).
    

    【讨论】:

    • 有点困惑什么是 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(9), l(10)))))), N = h(1) 这是我得到的输出我输入了我们正在评估的树。
    • @Anticipating 我修正了一个错字。
    【解决方案2】:

    代码看起来还不错,也许缩进数据并使用与注释中相同的仿函数会有所帮助:

    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.
    

    手动格式化很乏味。如果您使用 SWI-Prolog,IDE 将为您完成,只需在每个逗号后放置一个换行符。

    测试:

    ?- t.
    true.
    

    【讨论】:

    • 我的坏人还没有早上喝咖啡。是的,我确实做到了。也是。
    • @WillNess 你在代码中找到错误了吗?它仍然在那棵特定的树上给出真实的。甚至把它画在纸上,看看它是否平衡,帖子中的评论只是误导。但至少在我的论文上看起来真的很不平衡。
    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多