`

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
分享到:
评论

相关推荐

    Concurrent Programming in ERLANG (P1-90)

    ### 并发编程在Erlang中的应用 #### 标题和描述中的核心知识点解析 **并发编程在Erlang中的应用(Concurrent Programming in ERLANG)** 本标题及描述明确指出了文档的主要内容是关于如何在Erlang语言中进行并发...

    Concurrent Programming in ERLANG

    ### 并发编程在Erlang中的应用 #### 引言 Erlang是一种专为构建高并发、容错性强的分布式系统而设计的编程语言。它的设计理念深受函数式编程的影响,同时也支持过程式编程的一些特性。《并发编程在Erlang》这本书...

    A Study of Erlang ETS Table

    ### Erlang ETS表的研究 #### 摘要与研究背景 本文研究了在Erlang环境下使用一种相对较新的数据结构——Judy数组来实现内存数据库(Erlang ETS)的可能性。研究通过对比基于四种不同数据结构的ETS表性能来进行:...

    cpie-cn_r148.pdf

    ### Erlang并发编程知识点概述 #### 1. Erlang教程 - **串行编程**:介绍如何在Erlang中实现基本的串行程序设计,包括变量声明、流程控制等。 - **数据类型**:Erlang支持多种数据类型,如整数、浮点数、原子、列表...

    erl_pfds:『Purely Functional Data Structures』中描述的数据结构的 Erlang 实现

    2. **树(Trees)**:包括二叉树、红黑树等。在Erlang中,可以使用递归结构表示树,通过函数进行插入、查找和删除操作。例如,二叉搜索树(BST)可以通过比较节点值来进行排序操作。理解如何在保持纯函数式的同时...

    99-problems:Prolog Haskell 和 Erlang 中 99 问题的解决方案

    地位 第01章:列表 第 02 章:列表,续 第03章:再次列举 第04章:算术 第05章:逻辑和代码 第06章:二叉树 第07章:多路树 第08章:图表 第09章:其他问题 第 10 章:其他问题,续执照这里的代码是在 BSD 许可证 ...

    树的遍历和前序遍历后续遍历

    关于树的 遍历的小程序 和树的前序 终须遍历 和后续遍历 输入数字自动生成二叉树等功能的小程序设计

    阿尔卡特 朗讯 笔试题

    - **BHCA(忙时呼叫尝试次数)**和**Erlang**:BHCA是交换机最大处理能力的指标,Erlang是衡量话务量的单位,两者之间可通过公式转换,用于计算通信系统的容量需求。 - **3G标准**:包括WCDMA、CDMA2000、TD-SCDMA...

    Leetcode:和好基友一起刷题

    它的设计灵感来源于 C 语言,同时吸取了 Python、Ruby、Erlang 及其他语言的一些特性,旨在提高开发者的生产力和程序的运行效率。 在 LeetCode 上,你可以找到各种难度级别的算法题目,涵盖了数据结构(如数组、...

    互联网大厂Java高级工程师岗位面试真题

    - **二叉树**:基础的树形数据结构,每个节点最多有两个子节点。 - **红黑树**:自平衡的二叉搜索树,保证了插入、删除操作的时间复杂度为O(log n)。 - **红黑树与B树、B+树的区别**:B树适合磁盘等外部存储,...

Global site tag (gtag.js) - Google Analytics