在二叉树中查找同一级别上的最大节点数(Prolog)

时间:2016-12-18 12:58:26

标签: prolog binary-tree

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

  • 是空的,或
  • 由根节点和左右二进制子树组成 节点

因此,继承上述定义,我们可以使用满足以下binaryTree谓词的术语集来表示Prolog中的二叉树。

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

例如,以下b树

enter image description here

对应结构:

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

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

1 个答案:

答案 0 :(得分: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).