【数据结构】树的介绍

参考资料:《数据结构(C语言版)严蔚敏著》、网络资源
版权说明:未经作者允许,禁止转载。如引用本文内容,需标明作者及出处。如本文侵犯了您的权益,请联系我删除并致歉。
文章说明:如文章中出现错误,请联系我更改。如您对文章的内容有任何疑问,也欢迎来与我讨论。
本文正在施工中...请稍等...


基本概念

1、树:树是具有n(n≥0)个结点的有限集。当n=0时,称为空树。对于非空树的递归定义如下:
(1)有且仅有一个特定的称为根的结点;
(2)当n>1时,除根以外的结点可分为m(m>0)个互不相交的有限集,其中每个集合本身也是一棵树,并且称为根的子树。
2、结点的度:结点拥有的子树数目。
3、树的度:树中各结点的度的最大值。度为m的树,又称为m叉树。
4、终端结点:度为0的结点,也称为叶子结点。
5、非终端结点:度不为0的结点,也称为分支结点。
6、孩子结点、双亲结点:结点的子树的根称为该结点的孩子结点,相应的,该结点称为孩子结点的双亲结点。
7、兄弟结点:同一个双亲结点的各个孩子结点之间互称兄弟结点。
8、祖先结点:结点的祖先结点是从根结点到该结点所经分支上的所有结点。
9、子孙结点:以某结点为根的子树中的任一结点都称为该结点的子孙结点。
10、结点的层次:从根结点开始定义起,根结点为第一层,根结点的孩子结点为第二层,以此类推。
11、树的深度:树中结点的最大层次,也称为树的高度。
12、有序树:如果将树中结点的各子树看成从左到右是有次序的,不能互换位置,则称该树为有序树,否则称为无序树。
13、结点间的路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。
14、路径长度:路径上的分支数目称为路径长度。
15、树的路径长度:从树根到每一个结点的路径长度之和。
16、结点的带权路径长度:从该结点到树根之间的路径长度与该结点上权的乘积。
17、树的带权路径长度:树中所有叶子结点的带权路径长度之和。

性质

1、树中的结点数等于所有结点的度数加1。

证明:根据树的定义,在一棵树中,除根结点以外的每个结点有且仅有一个直接前驱,也就是说,每个结点与指向它的分支一一对应,所以除根结点以外的结点数等于所有结点的分支数,也即度数,而根结点无直接前驱,因此树的结点数等于所有结点的度数加1。

2、m叉树中第\fn_cm k层上至多有m^{k-1}个结点。

证明:用数学归纳法证明,对于k=1,显然成立。假设对于第k层,上述结论成立,即第k层最多有m^{k-1}个结点。对于第k+1层,结点数最多为第k层结点数的m倍,也就是第k层的每个结点都向下延伸了m条分支,所以第k+1层的结点数为m^{k-1}*m=m^{k}=m^{(k+1)-1},得证。

3、高度为hm叉树至多有(m^{h}-1)/(m-1)个结点。 

证明:由第2条性质可知,当每层的结点数都是最大时,该树的结点数最大。故高度为hm叉树的最大结点数为:

\sum_{i=1}^{h}m^{i-1}=m^{0}+m^{1}+...+m^{h-1}=\frac{m^{h}-1}{m-1}

4、具有n个结点的m叉树的最小高度为\left \lceil log_{m}(n(m-1)+1) \right \rceil

证明:由第2条性质可知,对于给定的结点个数,当每层的结点数都是最大时,树的高度最小。设最小高度为h,则有

\sum_{i=1}^{h}m^{i-1}=m^{0}+m^{1}+...+m^{h-1}=\frac{m^{h}-1}{m-1}\geqslant n

m^{h}\geqslant n(m-1)+1

h=\left \lceil log_{m}(n(m-1)+1) \right \rceil

抽象数据类型定义

ADT Tree{
    数据对象D:
    数据关系R:
    基本操作P:
        InitTree(&T);
            操作结果:构造空树T。    
        DestroyTree(&T);
            初始条件:树T存在。
            操作结果:销毁树T。
        CreateTree(&T, definition);
            初始条件:definition给出树T的定义。
            操作结果:按definition构造树T。
        ClearTree(&T);
            初始条件:树T存在。
            操作结果:将树T清为空树。
        TreeEmpty(T);
            初始条件:树T存在。
            操作结果:若T为空树,则返回TRUE,否则返回FALSE。
        TreeDepth(T);
            初始条件:树T存在。
            操作结果:返回T的深度。
        Root(T);
            初始条件:树T存在。
            操作结果:返回T的根。
        Value(T, cur_e);
            初始条件:树T存在,cur_e是T中某个结点。
            操作结果:返回cur_e的值。
        Assign(T, cur_e, value);
            初始条件:树T存在,cur_e是T中的某个结点。
            操作结果:结点cur_e赋值为value。
        Parent(T, cur_e);
            初始条件:树T存在,cur_e是T中的某个结点。
            操作结果:若cur_e是T的非根结点,则返回它的双亲,否则函数值为“空”。
        LeftChild(T, cur_e);
            初始条件:树T存在,cur_e是T中的某个结点。
            操作结果:若cur_e是T的非叶子结点,则返回它的最左孩子,否则返回“空”。
        RightSibling(T, cur_e);
            初始条件:树T存在,cur_e是T中的某个结点。
            操作结果:若cur_e有右兄弟,则返回它的右兄弟,否则函数值为“空”。
        InsertChild(&T, &p, i, c);
            初始条件:树T存在,p指向T中的某个结点,1≤i≤p所指结点的度+1,非空树c与T不相交。
            操作结果:插入c为T中p所指结点的第i棵子树。
        DeleteChild(&T, &p, i);
            初始条件:树T存在,p指向T中某个结点,1≤i≤p指结点的度。
            操作结果:删除T中p所指结点的第i棵子树。
        TraverseTree(T, visit());
            初始条件:树T存在,visit是对结点操作的应用函数。
            操作结果:按某种次序对T的每个结点调用函数visit()一次且至多一次。一旦visit()失败,则操作失败。
}ADT Tree

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wingrez

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值