list of the values in the leaf nodes of binary tree T

后端 未结 3 1720
梦如初夏
梦如初夏 2020-11-28 15:54

List is the list of values in leaf nodes of a binary tree and I am trying to figure out how to output just that. This is giving me all the nodes but I need just the leaves

相关标签:
3条回答
  • 2020-11-28 16:35

    The same solution, not so far from first implementation, can be expressed as:

    lea(nil, []).
    lea(t(X, nil, nil), [X]).
    lea(t(_, A, B), L) :-
        lea(A, L1),
        lea(B, L2),
        append(L1, L2, L)
        L \= [].
    

    The last row (L \= []) can be removed (if you accept the possibility of find every solution).

    0 讨论(0)
  • 2020-11-28 16:37

    Let's use a DCG - a Definite Clause Grammar. We start with your original definition:

    lea(T, L) :-
       phrase(values(T), L).
    
    values(nil) -->
       [].
    values(t(X,L,R)) -->
       [X],
       values(L),
       values(R).
    

    Now, we need to restrict ourselves to those t/3 that are leaves. One possibility is to enumerate all cases:

    lea2(T, L) :-
       phrase(leaves(T), L).
    
    leaves(nil) -->
       [].
    leaves(t(X,nil,nil)) -->
       [X].
    leaves(t(_,L,R)) -->
       { dif(L+R,nil+nil) },
       leaves(L),
       leaves(R).
    

    It would be even better and more efficient to use a conditional construct similar to if_/3. I want to leave this to someone interested.

    0 讨论(0)
  • 2020-11-28 16:52

    First, we extend if_/3 to work with DCG's:

    if_(C_1, Then_0, Else_0) -->                    % if_//3
       { call(C_1, Truth) },
       { functor(Truth, _, 0) },                    % safety check
       (  { Truth == true  } -> phrase(Then_0)
       ;  { Truth == false },   phrase(Else_0)
       ).
    

    Using if_//3 and (=)/3 we can handle non-nil tree nodes with one clause (instead of two):

    lea3(T, Ls) :-
       phrase(leaves(T), Ls).
    
    leaves(nil) --> [].
    leaves(t(X,L,R)) -->
       if_(L-R = nil-nil, [X], []),
       leaves(L),
       leaves(R).
    
    0 讨论(0)
提交回复
热议问题