zoukankan      html  css  js  c++  java
  • 数据结构与算法----树(下)

      大家好,今天继续学习树的数据结构。在上一章,我们讲树的孩子兄弟表示法时,提到了二叉树。今天,我们就来学习二叉树的相关性质。

     一、二叉树定义:

    二叉树(Binary Tree):n(n≥0)个结点的有限集合,该集合或者为空集(为空时,称为空树),或者由一个根结点、两棵互不相交、称为根结点的左子树、右子树的二叉树组成。(Note:大家注意了,我们在给出二叉树定义时,我们利用了递归概念。就是先给出二叉树概念,再用二叉树概念去解释二叉树。递归是一种很重要的方法,在数据结构中是很重要的,我们会在后面章节中提到。)

    我们看图来理解一下二叉树:

    image

    二、二叉树的特点:

      1、二叉树中的结点度数,一定小于等于2。(根据二叉树定义,由一个根结点、两棵互不相交的称为根结点左子树、右子树的二叉树组成。note:度数不是只能是2,是至多是2)

    2、左子树与右子树是有顺序的,次序不能颠倒。

    3、即使树中只有一个子树,也要区分左子树、右子树。

    三、二叉树具有的5种基本形态:

    1.空二叉树

    2.只有根结点

    3.只有左子树的二叉树

    image

    4.只有右子树的二叉树

    image

    5.既有左子树又有右子树

    image

    四、特殊二叉树:

    1.斜二叉树:

       既然是斜二叉树,就一定要有斜度。

    image            image

    上面这两个图,就是斜二叉树。(note:看着是不是挺像线性表。其实,线性表就是二叉树的特殊表现形式)

    2.满二叉树:

    顾名思义,既然是满二叉树,就是每个结点都具备两个子树。如图:

    image

    如果二叉树中,每个结点都具备左子树、右子树,并且所有叶子结点都在同一层中,这样的二叉树称为满二叉树。

    满二叉树的特点:

    a.叶子结点只能出现在最后一层,如果不是,就不能达到满二叉树。

    b.非叶子结点的度数只能为2,如果不是,就会出现“缺胳膊少腿”的现象。

    c.在相同深度的二叉树中,满二叉树的结点最多,叶子结点最多。

    3.完全二叉树:

    对一棵具有n个结点的二叉树,按着层序编号,如编号为i(1≤i≤n)的结点位置,与同等深度的满二叉树中编号为i结点位置相同,则称这样的二叉树为完全二叉树。     完全二叉树不好理解,我们看一下图:

    image   image

    上面左图,是一棵完全二叉树,右图是一棵满二叉树。我们在心里给右图满二叉树按层序编号。通过左图与右图的对比,我们发现,左图中的任一结点,在右图中都有与之相对应的结点。

    下面再给出几张不是完全二叉树的图:

    image  image    image

    完全二叉树特点:

    a.如果结点度数为1,那么只能是左子树。(不存在只有右子树结点)

    b.叶子结点只能出现在最下两层。

    c.最下层的叶子结点,一定集中在左部连续位置。

    d.倒数两层,如果有叶子结点,一定集中在右部连续位置。

    e.同样结点数的树,完全二叉树的深度最小。

    五、二叉树性质:

       接下来,我们来学习一下二叉树的性质。在实际应用中,都是通过二叉树的性质来操作的。二叉树的性质,是非常重要的概念。

    a.在二叉树中,第i层的结点总数最多2^(i-1)个

    第一层: 1=2^(1-1)=2^0=1

    第二层:2=2^(2-1)=2^1=2

    第三层:4=2^(3-1)=2^2=4

    ……

    ……

    b.深度为k的二叉树,结点总数等于2^k-1

    深度为1:1=2^1-1=1

    深度为2:3=2^2-1=3

    深度为3:7=2^3-1=7

    ……

    ……

    c.如果n0是叶子结点,n2是度数为2的结点。则n0=n2+1.

    image

    二叉树中,除了叶子结点就是度数为1、度数为2的结点。我们假设度数为1的结点为n1、度数为2的结点为n2、叶子结点为n0.则树中结点总数为n=n0+n1+n2.我们观察上图,研究一下节点之间的连接线。因为根结点只有出去的线,没有进入的线。所以总线+1就是结点总数,n1+2n2+1=n0+n1+n2  n0=n2+1

    d.具有n个结点数的完全二叉树的深度为[log2N]+1([x]表示不大于x的最大整数)。

    e.如果对一棵有n个结点的完全二叉树(其深度为[log2N])的结点按层序编号(从第一层到[log2N]+1层,每层从左到右),对任一结点i(1≤i≤n)有:

    1.如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则双亲为[i/2].

    2.如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i.

    3.如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1

    我们将在下一章讲解二叉树的存储结构

  • 相关阅读:
    c# 启动线程的方式
    c# 打开文件夹获取所有文件
    windows server 2008 R2 SP1 安装SQL Server 2008 R2时提示 "此操作系统不支持此版本的 SQL Server 版本"
    mongodb 备份 指定用户名密码
    c# 线程启动的两种方式与传参
    vs 2015 密钥
    c# 时间格式yyyy-MM-ddTHH:mm:ss
    c# oledb sql 报错 标准表达式中数据类型不匹配
    CentOS下yum安装dnsmasq,并强制替换为最新版
    使用QUOTA(磁盘配额)来限制用户空间
  • 原文地址:https://www.cnblogs.com/VitoCorleone/p/4022808.html
Copyright © 2011-2022 走看看