erlang 实现二叉树

此为一练习题,为《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.



猜你喜欢

转载自blog.csdn.net/lijing_lj928/article/details/43754191