-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中的应用(Concurrent Programming in ERLANG)** 本标题及描述明确指出了文档的主要内容是关于如何在Erlang语言中进行并发...
### 并发编程在Erlang中的应用 #### 引言 Erlang是一种专为构建高并发、容错性强的分布式系统而设计的编程语言。它的设计理念深受函数式编程的影响,同时也支持过程式编程的一些特性。《并发编程在Erlang》这本书...
### Erlang ETS表的研究 #### 摘要与研究背景 本文研究了在Erlang环境下使用一种相对较新的数据结构——Judy数组来实现内存数据库(Erlang ETS)的可能性。研究通过对比基于四种不同数据结构的ETS表性能来进行:...
### Erlang并发编程知识点概述 #### 1. Erlang教程 - **串行编程**:介绍如何在Erlang中实现基本的串行程序设计,包括变量声明、流程控制等。 - **数据类型**:Erlang支持多种数据类型,如整数、浮点数、原子、列表...
2. **树(Trees)**:包括二叉树、红黑树等。在Erlang中,可以使用递归结构表示树,通过函数进行插入、查找和删除操作。例如,二叉搜索树(BST)可以通过比较节点值来进行排序操作。理解如何在保持纯函数式的同时...
地位 第01章:列表 第 02 章:列表,续 第03章:再次列举 第04章:算术 第05章:逻辑和代码 第06章:二叉树 第07章:多路树 第08章:图表 第09章:其他问题 第 10 章:其他问题,续执照这里的代码是在 BSD 许可证 ...
关于树的 遍历的小程序 和树的前序 终须遍历 和后续遍历 输入数字自动生成二叉树等功能的小程序设计
- **BHCA(忙时呼叫尝试次数)**和**Erlang**:BHCA是交换机最大处理能力的指标,Erlang是衡量话务量的单位,两者之间可通过公式转换,用于计算通信系统的容量需求。 - **3G标准**:包括WCDMA、CDMA2000、TD-SCDMA...
它的设计灵感来源于 C 语言,同时吸取了 Python、Ruby、Erlang 及其他语言的一些特性,旨在提高开发者的生产力和程序的运行效率。 在 LeetCode 上,你可以找到各种难度级别的算法题目,涵盖了数据结构(如数组、...
- **二叉树**:基础的树形数据结构,每个节点最多有两个子节点。 - **红黑树**:自平衡的二叉搜索树,保证了插入、删除操作的时间复杂度为O(log n)。 - **红黑树与B树、B+树的区别**:B树适合磁盘等外部存储,...