此为一练习题,为《Erlang程序设计》第7章后的练习题, 7-5 二叉树记录
建立二叉树:
-ifdef(debug).
-define(DBG(Str, Args), io:format(Str, Args)).
-else.
%-define(DBG(Str, Args), ok).
-define(DBG(Str, Args), io:format(Str, Args)).
-endif.
insert (NV, null) ->
#btree{value=NV};
insert (NV, #btree{value=V, ltree=null, rtree=null}=N)->
if
NV =< V ->
N#btree{ltree=#btree{value=NV}};
true ->
N#btree{rtree=#btree{value=NV}}
end;
insert (NV, #btree{value=V, ltree=L, rtree=null}=N) ->
if
NV =< V ->
N#btree{ltree=insert (NV, L)};
true ->
N#btree{rtree=#btree{value=NV}}
end;
insert (NV, #btree{value=V, ltree=null, rtree=R}=N) ->
if
NV =< V ->
N#btree{ltree=#btree{value=NV}};
true ->
N#btree{rtree=insert(NV, R)}
end;
insert (NV, #btree{value=V, ltree=L, rtree=R}=N) ->
if
NV =< V ->
N#btree{ltree=insert (NV, L)};
true ->
N#btree{rtree=insert (NV, R)}
end.
对二叉树上的数据求和:
sum (null) -> 0;
sum (#btree{value=V, ltree=null, rtree=null}) ->
V;
sum (#btree{value=V, ltree=L, rtree=null}) ->
V + sum(L);
sum (#btree{value=V, ltree=null, rtree=R}) ->
V + sum(R);
sum (#btree{value=V, ltree=L, rtree=R}) ->
V + sum(L) + sum(R).
找出二叉树上的最大值:
maxv(#btree{value=V, ltree=null, rtree=null}) ->
V;
maxv(#btree{value=V, ltree=L, rtree=null}) ->
TV = maxv(L),
if
TV < V -> V;
true -> TV
end;
maxv(#btree{value=V, ltree=null, rtree=R})->
TV = maxv(R),
if
TV < V -> V;
true -> TV
end;
maxv(#btree{value=V, ltree=L, rtree=R}) ->
TL = maxv(L),
TR = maxv(R),
T = if
TL < TR -> TR;
true -> TL
end,
if
T < V -> V;
true -> T
end.
判断是否为有序二叉树:
is_btree (#btree{value=V, ltree=null, rtree=null}) ->
?DBG("~p line=~p~n", [V, ?LINE]),
true;
is_btree (#btree{value=V, ltree=L, rtree=null}) ->
?DBG("~p line=~p~n", [V, ?LINE]),
if
L#btree.value =< V ->
is_btree(L);
true ->
false
end;
is_btree(#btree{value=V, ltree=null, rtree=R}) ->
?DBG("~p line=~p~n", [V, ?LINE]),
if
V < R#btree.value ->
is_btree(R);
true -> false
end;
is_btree(#btree{value=V, ltree=L, rtree=R}) when (V >= L#btree.value) and (V < R#btree.value) ->
?DBG("~p line=~p~n", [V, ?LINE]),
is_btree (L) and is_btree(R);
is_btree(_) ->
?DBG("line=~p~n", [?LINE]),
false.