zoukankan      html  css  js  c++  java
  • 【树1】树的基本概念

    ---------注:本文所用的术语定义均来自国外大学和计算机文献使用的定义,非国内教材。层次编号从1开始-------------

    树的定义

    树(generic tree):树是含有n个结点的有限集,结点(node)通过边(edge)连接起来,形成树状的非线性结构
    当 n=0时,为空树。
    当 n>0时,仅有一个特殊的结点叫做根(root)的结点,它位于树的逻辑形态的最顶层,它没有父结点。
     
    树都可以看做是  连通  无环 图,即树中的结点都是连通的,且不构成环。
    树中的边(edge)是隐式有向的,方向从父结点指向他的每一个孩子结点。parent->children。
    树中的结点,除了根结点外,每一个结点都有一个父结点,以及0个或者多个孩子结点。
     
    树的逻辑结构类似一颗倒立着的真实世界里的树。如下图中,整体是一个有6个结点的树。R为树根,其余结点又可以找出2棵子树:子树1 , 子树2。子树1中,结点A又是子树1的root结点,而结点C 和 结点D又是 子树1 的2个子树。

    基本概念和名词解释

     
    结点(node) : 树中存储 数据元素以及 结点之间的逻辑连接信息的数据。图中使用一个圆圈表示。
    边(edge):结点与结点之间的逻辑连接,是2个结点构成的二元组。图中用一条线表示。
    路径(path): 一个结点和他的某一个子孙之间的通路,是由结点构成的序列。如(A , B ,E)就是A到E的路径。路径长就是这个序列代表的边数目。
     
    根结点(root):位于树的逻辑结构的最顶层的结点。下图的结点A即是。
     
    叶子结点(leaf):没有任何孩子结点的结点(度为0)。下图中的D,E,F都是叶子结点。叶子结点又叫外部结点(external)。
     
    内部结点(internal):非叶子结点即为内部结点。
     
    结点的度(degree):结点的子树的个数,即结点的孩子数。
     
    结点的深度(depth):从root结点到该结点的边的条数。(在具体实现时,可以求这个结点的祖先的个数作为他的深度,root 的深度是0)
    结点的高度(height):从该节点到它能到达的所有叶子的路径中最长的路径长度。(叶子结点的高是0)
    结点的层次(level) :结点到root结点之间的边数 +1 ,即结点的深度+1

    树的深度(tree depth):最深的叶子结点的深度。(树的深度和他的高度总是相等的
    树的高度(tree height):root结点的高度。(树的深度和他的高度总是相等的
    树的层次(tree level):以root结点为第1层,root的孩子为第2层,以此类推。
     
     
    父结点(parent):下图中,A是 B和C共同的父节点。除了root结点外,一个结点仅有一个父结点。root结点无父结点。
    孩子结点(child)一个结点的 直接子结点,叫做这个结点的孩子结点。下图中,A的孩子为B,C。  
    兄弟结点(sibling):拥有同一个parent的结点之间称为兄弟。
     
    祖先(ancestor):一般指真祖先,即不包括结点本身。一个结点的父结点,父结点的父结点...一直向上到root结点,都是他的祖先。下图,E的祖先是B和A。
    子孙(descendant):一般指真子孙,即不包括结点本身。以某结点为root结点的所有结点都是这个结点的子孙。下图B的子孙是D,E。
     

    森林

    定义:0个或者多个不相交的树形成森林。

    无回路且不一定连通的 图叫做森林,其中每一个连通分量为一个树。

     

    树的性质

    如果树非空,则  结点数     总比  边数  多 1: N = E + 1
         证明:除了root结点外,其余的结点都由 一条边引出来的(具体到图中,每个圆圈头上都有“一根草”),而root结点则没有,这就是少一的原因。

    树的分类

    一般树(generic tree):树中每个结点的孩子数目是不确定的,0个或多个。二叉树是generic tree的特例。
    自由树(free tree):即无环连通图,这种树我们倾向于用图的眼光去看待它,因为他没有指定那一个结点是root,他的任何结点都可以是root。
    有根树(rooted tree):明确指定了root结点的树,树的形态非常明显。一般我们谈论的树就是指有根树。
     
     
    按照子结点是否有序分:
    有序树:树中的每一个结点的所有孩子结点在逻辑上都是在意顺序的,是有序的:第一个孩子,第二个孩子,第三个孩子...第n个孩子。
    无序数:树中的每一个结点的孩子结点不在意他们的放置顺序,是无序的。
     
     
    按照形态分 :
     
    树 --
           二叉树--
                       满二叉树  
                       完全二叉树
           完美二叉树
                ...
          三叉树
          四叉树
          五叉树
          ...
     
     
     

    树和图的关系

    树都可以看做是 连通(没有孤岛), 无环 (从一个结点出发只有唯一的一条路径到达另一个结点),无向图,如果特别说明,也可以是有向图。如果将一个树看做是无向图,则可以任取一个结点为root,将得到不同意义的树。
     

    一般树的存储实现

    一般树(generic tree),特点是每个结点的度是不确定的。
    这里介绍2种存储实现。
    1、左孩子右兄弟表示法:将一般树转化为二叉树来存储,在一个一般树GT对应的二叉树BT中,每一个结点的左孩子对应GT中的这个结点的第一个孩子,而每一个结点的右孩子对应GT中这个结点的下一个相邻的兄弟。
     
    摘自维基百科:如下左边是一个一般树,右边是它对应的二叉树。
     
     
    class GenericTreeNode<T>
    {
        private T element;
        
        private GenericTreeNode<T> nextSibling;   //下一个兄弟
        private GenericTreeNode<T> firstChild;    //第一个孩子
        //...
    }

    2、孩子链表表示法

    结点的域有3个:element保存数据,parent保存这个结点的父结点的引用,children是一个保存他的所有孩子的引用的线性表。

    如果不需要访问父结点,则可以去掉parent域。

    class GenericTreeNode<T>
    {
        private T element;
        
        private  GenericTreeNode<T> parent;           //父结点的引用
        private  List<GenericTreeNode<T>> children;   //保存所有孩子结点的引用的线性表
        //...
    }
  • 相关阅读:
    游戏引擎中的光照算法
    深入剖析GPU Early Z优化
    UE4联机编译光照
    深入剖析MSAA
    Unity 使用xLua遇到的坑
    扩展SQLite使其能从apk文件中读取db
    tolua#代码简要分析
    虚幻4垃圾回收剖析
    虚幻4蓝图虚拟机剖析
    java转成xml
  • 原文地址:https://www.cnblogs.com/lulipro/p/7521022.html
Copyright © 2011-2022 走看看