【问题标题】:Find the maximum number of nodes on the same level in a binary tree (Prolog)查找二叉树中同一级别的最大节点数(Prolog)
【发布时间】:2016-12-18 12:58:26
【问题描述】:

让我们将二叉树结构定义为一组节点,树本身是:

  • 为空或,
  • 由根节点和左右二叉子树组成 节点

因此,根据上述定义,我们可以在 Prolog 中使用满足以下 binaryTree 谓词的一组术语来表示二叉树。

binaryTree(nil):- !.
binaryTree(bTree(L, _, R)):- binaryTree(L), binaryTree(R).

比如下面的b树

对应结构:

bTree(bTree(nil, b, nil), a, bTree(bTree(nil, d, nil), c, nil))

我的问题是关于如何找到给定二叉树的长度,即同一级别上的最大节点数。

【问题讨论】:

    标签: prolog binary-tree


    【解决方案1】:

    你可以做这样的事情(没有做太多的测试来验证正确性,这取决于你):

    binaryTree(nil):- !.
    binaryTree(bTree(L, _, R)):- binaryTree(L), binaryTree(R).
    
    max_length(T, Max):-
        traverse(T, 0, Ts),
        get_levels(Ts, Levels),
        sort(0, @=<, Levels, Levels1),
        get_max_length(Levels1, _, 0, 0, Max).
    
    traverse(bTree(L,V,R), Level, bTree(L1, V, R1, Level)):-
        Level1 is Level + 1,
        traverse(L, Level1, L1),
        traverse(R, Level1, R1).
    
    traverse(nil, _, nil).
    
    get_levels(nil, []).
    
    get_levels(bTree(L,_,R, Lev), [Lev|Levs2]):-
        get_levels(L, Levs0),
        get_levels(R, Levs1),
        append(Levs0,Levs1,Levs2).
    
    get_max_length([], _, Acc,Max0, Max1):-
        (Acc > Max0 ->
         Max1 is Acc;     
         Max1 is Max0
        ).
    
    get_max_length([Curr|T], Curr, Acc, Max0, Max1):-
        Acc1 is Acc + 1,
        get_max_length(T, Curr, Acc1, Max0, Max1).
    
    get_max_length([X|T], Curr, Acc, Max0, Max1):-
        \+ X = Curr,
        (Acc > Max0 ->
         get_max_length(T, X, 1, Acc, Max1);     
         get_max_length(T, X, 1, Max0, Max1)
        ).
    

    2 个测试用例,首先是图片中的树,然后是这棵树:

                                                       +-----+
                                                      -+-----+---
                                                  ---/           \-----
                                       +------+--/                     \+------+
                                     --+------+                         ++-----+---
                                   -/         |                          |         \---
                           +-----+/           +------+          +-------/              \+------+
                           /-----\            /------\          /-------\               +/-----+-
                         -/       \         -/        \       -/         \-            -/        \---
                       -/         |       -/          |     -/             \         -/              \--
                +-----/     +------\    +/----+   +----\  +/----+    +------\       /------+      +-----\-
                +-----+     +------+    +-----+   +----+  +-----+    +------+       +------+      +-----+
    

    将以下内容添加到代码中并使用test.运行

    test:-
        T0 = bTree(bTree(nil, b, nil), a, bTree(bTree(nil, d, nil), c, nil)),
        max_length(T0, 2),
        T1 = bTree(
                   bTree(
                         bTree(
                               bTree(
                                     nil,
                                     3,
                                     nil
                                    ),
                               2,
                               bTree(
                                     nil,
                                     4,
                                     nil
                                    )
                              ),
                         1,
                         bTree(
                               bTree(
                                     nil,
                                     6,
                                     nil
                                    ),
                               5,
                               bTree(
                                     nil,
                                     7,
                                     nil
                                    )
                              )
                        ),
                   0,
                   bTree(
                         bTree(
                               bTree(
                                     nil,
                                     10,
                                     nil
                                    ),
                               9,
                               bTree(
                                     nil,
                                     11,
                                     nil
                                    )
                              ),
                         8,
                         bTree(
                               bTree(
                                     nil,
                                     13,
                                     nil
                                    ),
                               12,
                               bTree(
                                     nil,
                                     14,
                                     nil
                                    )
                              )
                        )),
        max_length(T1, 8).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      相关资源
      最近更新 更多