`

erlang 二叉树

阅读更多
-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).




祝你好运!!!
0
0
分享到:
评论

相关推荐

    erlang编程 Introducing Erlang

    erlang入门电子书 erlang编程 Introducing Erlang,作者Simon.St.Laurent

    erlang_版本24.3.4.4

    erlang 安装包

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个) ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    erlang otp25 win安装包

    erlang otp25 win安装包

    Erlang及其应用Erlang及其应用

    Erlang及其应用Erlang及其应用Erlang及其应用

    erlang22最新下载包

    erlang22最新下载包 erlang22.1.tar.gz erlang22最新下载包 erlang22最新下载包

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    erlang25.0 windows版本

    erlang25.0 windows版本

    Erlang26-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_windows_amd64.exe rabbitmq-server-3.8.4.exe

    esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...

    可在ubuntu上安装erlang的deb包

    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文献及资料汇总 入门资料: erlang中文手册(R11B 文档译文,最适合入门) erlang位运算与二进制解析 erlang二进制高效编程 erlang异常处理详解 开发经验: 面对软件错误构建可靠的分布式系统 编写分布式的 ...

    erlang 中文基础教程

    erlang 中文基础教程erlang 中文基础教程

    introducing erlang

    Erlang特性: ● 并发性 - Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制。 ● 分布式 - 一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点) ● 健壮性 - Erlang...

    erlang资源

    erlang资源,非常值得下载,二郎学习

    rabbitMq和erlang安装包

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...

    erlang安装包.zip

    erlang安装包

    win64_erlang24.2.2

    win64位系统 。 erlang24.2.2。

    Erlang官网下载过慢

    Erlang在官网下载页面一直出现无法请求的情况,现在将下载下来的32位和64位的安装包分享

Global site tag (gtag.js) - Google Analytics