树(Tree)

树(Tree)

1. 树的概念

  • 树形结构是以分支关系定义的层次结构,是一类重要的非线性数据结构。
  • 树是包含n(n>0)个结点的有穷集,也就说树是由一个集合以及在该集合上定义的一种关系构成的。
  • 树可分为无根树(自由树、无序树)和有根树(系统树、有序树)。
    (1)无根树(unrooted tree): 在离散数学中指无环连通无向图。
    (2)有根树(rooted tree):指具有方向的系统发生树(phylogenetic tree),包含唯一的根结点。

2. 无根树的结构特征及特点

  • 一棵无根树是一个二元组 <V,E> <script type="math/tex" id="MathJax-Element-5"> </script>,其中,V是非空集合,称为顶点集,E是V中元素构成的无序二元组的集合,称为边集。
  • 无根树要求每个顶点之间都直接或间接相连,且图中没有环,即只有简单路径。
  • 由于树是图的子集,无环连通无向图具有树的特征,但不具有树状的形式,没有特定的根节点,故称为无根树。
  • 无根树结构图示例:
    这里写图片描述
  • 注:任意选取无环连通无向图中某个点为根,均可将无根树转化成为有根树。

3. 有根树的结构特征及特点

  • 有根树是由n(n>0)个有限结点组成一个具有层次关系的集合。
  • 有根树的层次结构中有且仅有一个结点具有特殊的地位——根结点(树根)。
  • 有根树具有以下的特点:
    (1)每个结点有零个或多个子结点;
    (2)没有父结点的结点称为根节点;
    (3)每一个非根结点有且只有一个父结点;
    (4)除了根节点外,每个子结点可以分为多个不相交的子树;
  • 有根树结构在计算机系统和其他领域中的五种表示方法:
    这里写图片描述
  • 注:树的定义是一个递归的定义,即树的定义中又用到了树的概念。

4. 有根树的相关术语

4.1 结点(node)
  • 包含数据项及指向其他结点的分支。
4.2 结点的度(degree)
  • 指结点所拥有的子树棵数。
4.3 叶结点(leaf)
  • 指度为零的结点,又称为终端结点。
4.4 分支结点(branch)
  • 除叶结点外的其他结点,又称为非终端结点。
4.5 子女结点(child)
  • 若结点x有子树,则子树的根结点即为结点x的子女。
4.6 父结点(parent)
  • 若结点x有子女,则该结点即为子女的父结点。
4.7 兄弟结点(sibling)
  • 同一父结点的子女互称为兄弟。
4.8 祖先结点(ancestor)
  • 从根结点到该结点所经分支上的所有结点。
4.9 子孙结点(descendant)
  • 指某一结点的子女,以及这些子女的子女都是该结点的子孙。
4.10 结点所处层次(level)
  • 简称结点的层次,即从根结点到该结点所经路径上的分支条数。
4.11 树的深度(depth)
  • 树中距离根结点最远的结点所处层次即为该树的深度,空树的深度为0,只有一个根结点的树的深度为1。(计算方向:从下往上)
4.12 树的高度(height)
  • 树的高度与树的深度计算的方向不同,但是数值相等。(计算方向:从上往下)
4.13 树的度(degree)
  • 树中结点的度的最大值。
4.14 有序树(ordered tree)
  • 树中结点的各棵子树 T0T1... 是有次序的,即为有序树,其中, T1 叫作根的第一棵子树, T2 叫作根的第二棵子树,…。
4.15 无序树(unordered tree)
  • 树中结点的各棵子树之间的次序是不重要的,可以互相交换位置。
4.16 森林(forest)
  • 指m(m>0)棵树的集合。

5. 树的抽象类定义——应用了模板类来描述树抽象数据类型

  • 文件:Tree.h

    
    #ifndef TREE_H_
    
    
    #define TREE_H_
    
    
    template <class T>
    class Tree
    {
    public:
        Tree() {}                              //构造函数,生成树的结构并初始化
        virtual ~Tree() {}                     //析构函数,释放树所占存储
    public:
        virtual int GetRootPosition() = 0;                     //返回根结点地址,若树为空,则返回0
        virtual bool BuildRoot(const T& vaule) = 0;            //建立树的根结点
        virtual int GetNodeCount() = 0;                        //获取树中一共有多少个结点
        virtual bool isEmpty() = 0;                            //判断树是否为空
    };
    
    
    #endif  /* TREE_H_ */
    

参考文献:
[1]《数据结构(用面向对象方法与C++语言描述)(第2版)》殷人昆——第五章
[2] 百度搜索关键字:树(数据结构名词)、无根树、有根树

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值