-module(ltree).
-export([is_leaf/1,sum/1,max/1,is_ordered/1,insert/2]).
-export([test/0]).
-record(btree, {value, ltree=nil, rtree=nil}).
% 判断某个节点是否为叶子节点
is_leaf(#btree{ltree=nil,rtree=nil}) ->
true;
is_leaf(#btree{}) ->
false.
% 整棵树所有节点的值的和
sum(#btree{value=Value, ltree=nil, rtree=nil}) ->
Value;
sum(#btree{value=Value, ltree=nil, rtree=Rtree}) ->
sum(Rtree) + Value;
sum(#btree{value=Value, ltree=Ltree, rtree=nil}) ->
sum(Ltree) + Value;
sum(#btree{value=Value, ltree=Ltree, rtree=Rtree}) ->
sum(Ltree) + sum(Rtree) + Value.
% 整棵树节点值的最大值
max(#btree{value=Value, ltree=nil, rtree=nil}) ->
Value;
max(#btree{value=Value, ltree=nil, rtree=Rtree}) ->
erlang:max(Value, max(Rtree));
max(#btree{value=Value, ltree=Ltree, rtree=nil}) ->
erlang:max(Value, max(Ltree));
max(#btree{value=Value, ltree=Ltree, rtree=Rtree}) ->
erlang:max(Value, erlang:max(max(Ltree), max(Rtree))).
% 判断一个二叉树是否有序的
is_ordered(#btree{ltree=nil, rtree=nil}) ->
true;
is_ordered(#btree{value=Value, ltree=Ltree, rtree=nil}) ->
if
Value >= Ltree#btree.value ->
is_ordered(Ltree);
true -> false
end;
is_ordered(#btree{value=Value, ltree=nil, rtree=Rtree}) ->
if
Value =< Rtree#btree.value ->
is_ordered(Rtree);
true -> false
end;
is_ordered(#btree{value=Value, ltree=Ltree, rtree=Rtree}) ->
if
Value >= Ltree#btree.value, Value =< Rtree#btree.value ->
is_ordered(Ltree),
is_ordered(Rtree);
true -> false
end.
% 如果一个二叉树是有序的,往该树再插节点,保持树有序
insert(NewValue, #btree{value=Value, ltree=nil, rtree=nil}) ->
if
Value > NewValue ->
#btree{value=Value,
ltree=#btree{value=NewValue},
rtree=nil};
true ->
#btree{value=Value,
ltree=nil,
rtree=#btree{value=NewValue}}
end;
insert(NewValue, #btree{value=Value, ltree=Ltree, rtree=nil}) ->
if
Value =< NewValue ->
#btree{value=Value,
ltree=Ltree,
rtree=#btree{value=NewValue}};
true ->
#btree{value=Value,
ltree=insert(NewValue, Ltree),
rtree=nil}
end;
insert(NewValue, #btree{value=Value, ltree=nil, rtree=Rtree}) ->
if
Value > NewValue ->
#btree{value=Value,
ltree=#btree{value=NewValue},
rtree=Rtree};
true ->
#btree{value=Value,
ltree=nil,
rtree=insert(NewValue, Rtree)}
end;
insert(NewValue, #btree{value=Value, ltree=Ltree, rtree=Rtree}) ->
if
Value > NewValue ->
#btree{value=Value,
ltree=insert(NewValue, Ltree),
rtree=Rtree};
true ->
#btree{value=Value,
ltree=Ltree,
rtree=insert(NewValue, Rtree)}
end.
test()->
Btree1 = #btree{value=1},
Btree2 = #btree{value=4,
ltree=#btree{value=3},
rtree=#btree{value=5}},
Btree3 = #btree{value=3, % Btree3是有序的
ltree=#btree{value=2},
rtree=Btree2},
Btree4 = #btree{value=1,
ltree=#btree{value=2},
rtree=#btree{value=3}},
Btree5 = insert(1, Btree3), % Btree5也是有序的
Btrees = [Btree1, Btree2, Btree3, Btree4, Btree5],
TestPrint =
fun(#btree{}=Btree) ->
io:format("~p~n Sum: ~.3p Max: ~.3p, IsLeaf?: ~.3p, IsOrdered?: ~.3p~n",
[Btree, sum(Btree), max(Btree), is_leaf(Btree), is_ordered(Btree)])
end,
lists:foreach(TestPrint, Btrees).
祝你好运!!!
分享到:
相关推荐
erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent
erlang 安装包
ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)
erlang otp25 win安装包
Erlang及其应用Erlang及其应用Erlang及其应用
erlang22最新下载包 erlang22.1.tar.gz erlang22最新下载包 erlang22最新下载包
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
erlang25.0 windows版本
RabbitMQ version Minimum required Erlang/OTP Maximum supported Erlang/OTP Notes 3.13.0 26.0 26.2.x The 3.13 release series is compatible wtih Erlang 26. OpenSSL 3 support in Erlang is considered to ...
esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...
This package contains the Erlang/OTP runtime implementation, which is configured and built with HiPE support (allows compiling to native code), and minimal set of Erlang applications: compiler - ...
erlang文献及资料汇总 入门资料: erlang中文手册(R11B 文档译文,最适合入门) erlang位运算与二进制解析 erlang二进制高效编程 erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 ...
erlang 中文基础教程erlang 中文基础教程
Erlang特性: ● 并发性 - Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制。 ● 分布式 - 一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点) ● 健壮性 - Erlang...
erlang资源,非常值得下载,二郎学习
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
erlang安装包
win64位系统 。 erlang24.2.2。
Erlang在官网下载页面一直出现无法请求的情况,现在将下载下来的32位和64位的安装包分享