zoukankan      html  css  js  c++  java
  • K:树与二叉树

    相关介绍:

     树(英语:tree)是一种抽象数据类型(ADT)或是作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成的一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树形结构中数据元素之间具有一对多的逻辑关系,它反映了数据元素之间的层次关系,一个数据元素可以有多个后继,但最多只能有一个前驱。二叉树是树里面的一个特殊形态,每个节点最多只有两个分支(不存在分支度大于2的节点)。通常分支被称作“左子树”和“右子树”。二叉树的分支具有左右次序,不能颠倒。

    以下介绍树相关的知识点:

    1. 树的定义:树是由n(n>=0)个节点所构成的有限集合,当n=0时,称之为空树;当n>0时,n各节点,满足以下的情况:

      • 有且仅有一个称之为根的节点。
      • 其余节点可分为m(m>=0)个互不相交的有限集合,且每一个集合又构成一棵树,这棵树称为根节点的子树。
    2. 树的表示方法:树形表示法(最为常用)、文氏图表示法、凹入图表示法、广义表示法。图1.1展示了树的这四种表示方法。

    图1.1,即树的表示方法

    1. 树的常用术语

      • 树的节点:由一个数据元素及关联其子树的边所组成

      • 节点的路径:从根节点到该节点所经历的分支和节点的顺序排列

      • 路径的长度:指节点路径中所包含的分支数,也就是路径的节点数目减一。例如有一路径A->B->C->D,则其路径长度为3

      • 节点的度:该节点拥有的子树的数目

      • 树的度:树中所有节点的度的最大值

      • 叶节点(终端节点):树中度为0的节点

      • 分支节点(非终端节点、内部节点):树中度不为0的节点。在树中,除了叶节点外的所有节点都是分支节点

      • 孩子节点(子节点):一个节点的孩子节点是指这个节点的子树的根节点

      • 双亲节点(父节点):若树中某个节点有孩子节点,则这个节点就称为孩子节点的双亲节点。双亲节点和孩子节点也称为是具有互为前驱和后继关系的节点

      • 子孙节点:一个节点的子孙节点是指这个节点的所有子树中的任意节点

      • 祖先节点:一个节点的祖先节点是指该节点的路径中除此节点之外的所有节点

      • 兄弟节点:具有同一双亲的节点称为兄弟节点

      • 节点的层次:假设根节点的层次为0,则其它节点的层次是双亲节点的 层次数加一

      • 树的深度:树中所有节点层次数的最大值加一

      • 有序树:树中各节点的所有子树之间从左到右有严格的次序关系

      • 无序树:与有序树相反,无序树是指树中各节点的所有子树之间没有严格的次序关系

      • 森林:由m(m>=0)棵互不相交的树所构成的集合

    二叉树是一棵特殊的树,它的每个节点最多只有两棵子树,并且这两棵子树也是二叉树,由于二叉树中的两棵子树有左右之分,为此,二叉树是有序树。

    1. 二叉树的基本概念:二叉树是由n(n>=0)个节点所构成的有限集合。当n=0时,这个集合为空,此时的二叉树为空树;当n>0时,这个集合是由一个根节点和两个互不相交的分别称为左子树和右子树的二叉树所构成。

    2. 满二叉树:如果在一棵二叉树中,它的所有节点或者是叶节点,或者是左、右子树都非空,并且所有叶节点都在同一层上,则称这棵二叉树为满二叉树。

    3. 完全二叉树:如果在一棵具有n个节点的二叉树中,它的逻辑结构与满二叉树的前n个节点的逻辑结构相同,则称这样的二叉树为完全二叉树。完全二叉树其只允许缺少的叶节点在右半部分,而不允许在左半部分。下图1.2展示了满二叉树和完全二叉树,完全二叉树与非完全二叉树之间的区别。

    完全二叉树也满二叉树,完全二叉树与非完全二叉树

    1. 二叉树的性质

      • 在二叉树的第i层上至多有(2^{i})个节点(i>=0)

      • 深度为h(h>=0)的二叉树上至多含有(2^{h}-1)个节点

      • 对于任何一棵二叉树,若其叶节点的个数为N0,度数为2的节点的个数为N2,则有N0=N2+1。证明过程如下:

      设二叉树中度为1的节点个数为n1,二叉树的节点总数为n,则有:
      n=n0+n1+n2
      
      再设二叉树中具有e个分支,而度为1的节点是引出一个分支,度为2的节点是引出两个分支,则有:
      e=n1+n2*2
      
      又因为在二叉树中,除根节点外,每个节点均对应一个进入它的分支,所以有:
      n=e+1
      
      整合以上各式,得到n0=n2+1
      
      • 具有n个节点的完全二叉树的深度为(lfloor log_{2}N floor+1)或者(lceil log_{2}(N+1) ceil)

      • 若对含n个节点的完全二叉树从上到下,且从左到右进行0至n-1的编号,则对完全二叉树中任意一个编号为i的节点,有:

        1. 若i=0,则该节点是二叉树的根,无双亲;否则,编号为(lfloor frac{i-1}{2} floor)的节点为其双亲节点

        2. 若2i+1>=n,则该节点无左孩子节点,否则,编号为2i+1的节点为其左孩子节点

        3. 若2i+2>=n,则该节点无右孩子节点,否则,编号为2i+2的节点为其右孩子节点

    树与二叉树的区别:

     从二叉树的定义中可以看出,二叉树与树有着很大的不同,它们的区别在于:

    1. 树中的每个节点可以有多棵子树,而二叉树中的每个节点最多只能有2棵子树
    2. 树中的子树是不分顺序的,而二叉树中的子树有严格的左、右之分
    3. 二叉树与度小于等于2的树不同。在二叉树中允许某些节点只有右子树而没有左子树,而在树中,一个节点若没有第一棵子树,则它就不可能有第二棵子树的存在。

    回到目录|·(工)·)

  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/MyStringIsNotNull/p/8270798.html
Copyright © 2011-2022 走看看