erlang 实现二叉树

2023-11-08

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



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

erlang 实现二叉树 的相关文章

  • erlang - 如何将元组内容与 qlc 和 mnesia 匹配?

    我有一个记录该记录的记忆表 record peer peer key key is the tuple FileId PeerId last seen last event uploaded 0 downloaded 0 left 0 ip
  • Erlang:如何在控制Erlang进程崩溃时使连接的外部操作系统进程自动终止?

    我正在使用 Erlang 端口读取 Linux 进程的输出 我希望每当我连接的 Erlang 进程终止时 Linux 进程就会自动终止 从文档来看 在我看来这应该自动发生 但事实并非如此 最小的例子 将其放入文件 test erl 中 mo
  • Mnesia 返回 {aborted, no_transaction}

    我有一个名为 Mnesia 的表person 使用以下记录定义 record person id firstname lastname phone 该表包含以下值 12 alen dumas 97888888 13 franco mocci
  • 如何在 erlang 中格式化包含整数的平面字符串?

    在erlang中 我想格式化一个包含整数的字符串 并且我希望结果被展平 但我明白了 io lib format sdfsdf B 12312 115 100 102 115 100 102 32 12312 我可以使用下面的代码获得所需的结
  • Erlang 中事件流(又名 CEP)的实时关联/分析有什么框架吗?

    想要分析具有某些特征 例如公共来源 的事件流 并在给定的时间窗口内 最终将这些多个事件关联起来并从中得出一些推论 最后启动一些操作 我对复杂事件处理 CEP 的有限了解告诉我 它是此类事情的理想选择 然而 在我迄今为止的研究中 我发现人们将
  • Erlang / Golang 端口示例中的缓冲区大小

    我有一个粗略的 Erlang to Golang 端口示例 将数据从 Erlang 传递到 Golang 并回显响应 问题是我可以传输的数据量似乎仅限于 2 8 字节 见下文 我认为问题可能出在 Golang 方面 没有创建足够大的缓冲区
  • 在 Windows 上编译 Erlang 代码

    我安装了 Erlang 13B 并尝试按照教程进行操作 每次我到达c tut 我得到一个错误而不是 ok tut 所以看起来没有安装任何模块 有人能指出我正确的方向吗 我尝试过 Emacs 但我真的不知道如何使用它 甚至还没有接近让 Erl
  • Erlang:NIF 和透析器警告

    在实施 NIF 时 Dialyzer 给了我 函数 crc16 1 没有本地返回 可能是因为我这样做exit在 erl 模块中 如官方文档推荐 module my nifs export crc16 1 on load init 0 ini
  • 如何在没有任何服务器的情况下创建 P2P 网络聊天?

    有没有一种方法可以在没有任何服务器的情况下创建 P2P 网络聊天 可以 但是您必须决定见面地点 如果你的朋友把他的IP发给你 你就可以连接 那么你只需要告诉更多的人加入即可 一段时间后 你会变得越来越大 然后 如果网络上的某个链接发生故障
  • Elixir / Erlang Dialyzer:为什么行为回调的参数类型应该是子类型而不是超类型?

    我有一个行为 X 和一个参数类型的回调函数 a any 模块 Y 实现行为 X 实现模块 Y 中的回调函数具有参数类型 a any b any Dialyzer 不喜欢这样并抱怨 a b gt is not a supertype of a
  • ejabberd如何编译新模块

    Here http www ejabberd im node 2872我找到了代码 erlc I ejabberd 2 1 13 lib ejabberd 2 1 13 include pa ejabberd 2 1 13 lib ejab
  • 终止连接到 erlang 端口的进程

    我想写一个某种主管 我正在尝试实现关闭外部程序的功能 外部进程通过端口连接到 erlang 的代码 我不知道如何通过发送信号或其他任何方式来关闭该程序 关闭端口不是解决方案 因为我已经检查过许多程序不会在 SIGPIPE 上退出 您有任何想
  • 零部署 CouchDB 嵌入 Windows 应用程序?

    我可能在这里做梦 但我想知道是否有可能将最小的 CouchDB 引擎完全嵌入到 Windows 应用程序中 以便该应用程序可以运行而无需在用户计算机上安装 CouchDB Erlang 我已经提供了这种精简 捆绑的功能 请在此处查看http
  • Erlang 如何并发处理访问邮箱

    关于如何使用erlang邮箱的信息有很多 但很少找到一篇论文或文档描述erlang如何在VM内部同时实际访问邮箱 据我了解 Erlang VM 必须执行锁定或 CAS 操作以确保消息完整性 erlang幕后有没有什么精巧的方法 我假设您所说
  • 检查 Erlang 中的活动计时器

    有没有一种简单的方法来获取所有当前等待的计时器的列表erlang send after erlang apply after等在Erlang中 出于调试目的 您可以使用dbg 首先创建一个 ets 表来存储所有计时器引用 1 gt ets
  • Erlang 更好地支持哪种数据库(SQL)?

    你建议我在 Erlang 中使用什么 MySQL 还是 Postgres 哪个数据库有更好 更成熟 更稳定 更快 的 Erlang 驱动程序 The Erlang ODBC 接口 http erlang org doc apps odbc
  • Erl 无法连接到本地 EPMD。为什么?

    Erlang R14B04 erts 5 8 5 source 64 bit rq 1 async threads 0 kernel poll false Eshell V5 8 5 abort with G root ip 10 101
  • 使用自定义 mysql 模式的模块扩展 ejabberd?

    代替ejabberd sql https github com processone ejabberd blob master sql mysql sql L95 我正在使用自定义 MySQL 架构 由于遗留原因 我将对某些活动执行一些数据
  • Erlang 如何睡觉(晚上?)

    我想在 Erlang 服务器上每隔几个小时运行一次小型清理过程 我知道计时器模块 我在教程中看到一个示例 使用链式计时器 睡眠命令来等待几天后发生的事件 我觉得这很奇怪 我知道 Erlang 进程与其他语言中的进程相比是独一无二的 但是进程
  • Erlang 中的非终止函数类型

    我正在学习 Erlang 并尝试使用 Dialyzer 在可能的情况下获得最大的类型安全性 有一点不太明白 什么是类型非终止的函数以及如何表示它 spec 有人能解释一下吗 永远循环且永不终止的函数具有返回类型no return 该返回类型

随机推荐

  • promise与async和await的使用

    基础回顾 阻塞代码实例 首先 我们新建一个 test txt 文件 内容如下 111 然后 我们来编写一个 main js 文件 代码如下 var fs require fs var str fs readFileSync test txt
  • css button自动调整位置_(Vue动效)1.Vue的CSS过渡动效

    关键词
  • JAVA个推----将信息推送至手机端

    个推功能简介 将信息推送至手机端 手机端人员可以看到收到的信息 个推功能需要借助第三方平台的接口 需要申请账号 单独开发很难完成 这里就是用到了第三方接口 完成个推需要完成三步 获取token 调用个推接口需要获取用于验证的token 获取
  • 前端歌谣的刷题之路-第二十二题-基本数据类型检测

    前言 我是歌谣 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 本题目源自于牛客网 微信公众号前端小歌谣 题目 请补全JavaScript函数 要求以字符串的形式返回参数的类型 注意 只需检测基本数据类型 编辑 核心代码
  • 自动驾驶制图中的深度学习

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 深度学习在整个自动驾驶技术的各个部分中进行了应用 例如在感知 预测和计划中都有应用 同时 深度学习也可以用于制图 这是高级自动驾驶的关键组成部分 拥有准确的地图对于自动驾
  • Siebel学习笔记

    Siebel escript 的学习 1 Siebel的数据类型 Primitive 原始的 Number Integer Hexadecimal 十六进制 Octal 八进制 Floating Point 浮点 Decimal 十进制 S
  • 面试总结(1)---7.28

    Ajax关于readyState 状态值 和status 状态码 的研究 var getXmlHttpRequest function try 主流浏览器提供了XMLHttpRequest对象 return new XMLHttpReque
  • 解决wiringPi库与64位树莓派之间不兼容的问题

    目录 一 问题现象 二 解决方案 网站 可以直接点这下载 一 问题现象 今天在练习wiringPi库的使用时候 在最后编译的时候出现了这个问题 主要问题是这个skipping incompatible skipping incompatib
  • Android上OpenCV物体检测,Opencv图像识别Android实战(识别纸牌4.图像识别素养)

    我认为大多数阅读本文的人都对机器学习有所了解 我认为没有必要在学术上解释这种含义 人类学习的目的不是识别更多的东西 机器学习也是如此 也就是说 让计算机通过学习类比来学习更多的东西 在这里 我们让计算机知道图像 要让计算机知道事情 我们必须
  • 集成学习笔记

    集成学习通过结合规则 使用一系列弱学习器来组成一个强学习器 集成学习通常有两个步骤 ensemble generation 和 ensemble integration 通常在两个步骤之间会有一个 pruning process 剪枝过程
  • LeetCode--初级算法--环形链表

    题目 给定一个链表 判断链表中是否有环 为了表示给定链表中的环 我们使用整数 pos 来表示链表尾连接到链表中的位置 索引从 0 开始 如果 pos 是 1 则在该链表中没有环 示例 1 输入 head 3 2 0 4 pos 1 输出 t
  • Excel条件格式化(conditional formatting)应用

    简介 条件格式化顾名思义就是根据条件对单元格进行格式化 填充 字体等 比如我们有一个学生成绩表 根据需要我们要把成绩按 不及格 lt 60 良好 gt 60且 lt 90 优秀 gt 90 进行颜色标注 第一步 如图 第二步 如图 点击 确
  • OpenMP task 原理与实例

    个人理解 Openmp自从3 0以后全面走向任务驱动 task机制非常重要 可以显式定义任务 而其余parallel代码块中不用task定义的实际上是隐式任务 抽象来说就是有两个池子 线程池与任务池 闲置的线程会在线程池等待任务 显式任务与
  • Servlet登录注册(IDEA)

    user类 提供get set 有参 无参 toString方法 UserDao层 UserDaoImpl层 登录 注册是否重复 真正的注册 UserService层 登录LoginServlet层 注册和注册用户唯一的ZcServlet层
  • html,css,js简单介绍,html常用标签

    目录 简单介绍 HTML常用标签 1 html骨架标签 2 标题标签 3 段落标签 4 换行标签 5 文本格式化标签 6 div标签 span标签和pre标签 7 图像标签 8 超链接标签 9 注释标签 10 表格标签 11 列表标签 12
  • Geometry Shader 概念和实例

    前言 Shader Model 4给我们带来了Geometry Shader这个玩意儿 其实这个东西早就在一些3D动画制作软件中存在了 比如Maya 8 我参考了以前DX10的哪一篇Preview与Csustan edu的一篇比较详尽的教材
  • C语言实现url解析小实例

    一 前言 前面一口君写了一篇关于url的文章 一文带你理解URI 和 URL 有什么区别 本篇在此基础上 编写一个简单的用于解析url的小例子 最终目标是解析出URL中所有的数据信息 二 库函数 用到的几个库函数如下 1 strncasec
  • Dota数据集介绍

    文章目录 前言 DOTA数据集介绍 DOTAV1 0 DOTAV1 5 DOTAV2 0 标注方式 Task1 Detection with oriented bounding boxes Task2 Detection with hori
  • 基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(四)

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 模块实现 1 数据预处理 2 数据增强 3 模型构建 4 模型训练及保存 5 模型评估 6 模型测试 1 权限注册 2 模型导入 3 总体模型构建 4 处理视频中的预览帧数据 5
  • erlang 实现二叉树

    此为一练习题 为 Erlang程序设计 第7章后的练习题 7 5 二叉树记录 建立二叉树 ifdef debug define DBG Str Args io format Str Args else define DBG Str Args