7.非线性结构-二叉树

二叉树

二叉树的结构比较规范,有许多特有的性质和特点,可以用来方便地解决许多问题,是一种应用比较广泛的数据结构。

基本概念

  • 二叉树是有n(n≥0)个结点的有限集合(n等于0时称为空二叉树)。在一棵非空二叉树中:
    1. 有且只有一个特定的结点称为根结点;
    2. 当n大于1时,除根结点外的结点又分为两个互不相交的子集L和R,L和R也都是二叉树,L称为二叉树的左子树,R称为二叉树的右子树。L的根结点称为二叉树的左孩子,R的根结点称为二叉树的右孩子。

结构特点

二叉树具有与树相同的结构特点。

从形式上看,二叉树与度为2的树比较类似,但是二叉树与度为2的树是不同的。它们的不同之处在于:度为2的树的两个子树没有顺序,无左右之分;而二叉树的两个子树是有顺序的,分为左子树和右子树。

二叉树有5种基本形态:

  • 空树;
  • 只有一个根结点。
  • 只有左子树。
  • 只有右子树。
  • 左、右子树不全为空。
    二叉树的基本形态

特殊形态的二叉树

  • 满二叉树
    • 满二叉树是一棵深度为k,且有2^k-1个结点的二叉树。
    • 满二叉树中,所有的分支结点都有左孩子和右孩子。如果对满二叉树的结点从根结点开始,按从上而下、自左至右的顺序编号,根结点的编号为1,则最后一个结点的编号为2^k-1。
      满二叉树
  • 完全二叉树
    • 给定一棵深度为k的二叉树,从它的根结点开始,按从上而下、自左至右的顺序编号,根结点的编号为1,最后一个结点的编号为n,当且仅当它的每一个结点都与深度为k的满二叉树中编号从1到n的结点一一对应时,称该二叉树为完全二叉树。
    • 满二叉树也是完全二叉树完全二叉树

二叉树的性质

  • 性质1:在二叉树第i(i≥1)层上最多有2^(i-1)个结点。
  • 性质2:深度为k(k≥1)的二叉树,最多有2^k-1个结点。
  • 性质3:在任何非空二叉树中,若度为2的结点数为n2,叶子结点(度为0的结点)数为n0,则有 n0 = n2 + 1
  • 性质4:具有n(n>0)个结点的完全二叉树,其深度为在这里插入图片描述在这里插入图片描述
  • 性质5:给定一棵具有n个结点的完全二叉树,从它的根结点开始,按从上而下、自左至右的顺序编号,根结点的编号为1,最后一个结点的编号为n,则对于编号为i的结点有以下特点。
    1. 若2i≤n,则结点i的左孩子为结点2i,否则结点i无左孩子。
    2. 若2i+1≤n,则结点i的右孩子为结点2i+1,否则结点i无右孩子。
    3. 当i=1时,若结点i为根结点,则它无双亲结点,否则结点i的双亲结点为结点 i/2。
    4. 结点i所在的层次为在这里插入图片描述

二叉树的存储结构

顺序存储

由二叉树的性质5可知,对于完全二叉树,当从它的根结点开始,按从上而下、自左至右的顺序编号以后,结点的编号可以反映结点之间的关系。二叉树的顺序存储结构就利用了该性质,用一组连续的存储单元来存储二叉树的结点,结点的编号与存储单元的下标一致。这样就可以用存储单元的下标,即结点的编号来表达结点之间的逻辑关系。

用顺序存储结构存储二叉树时,分为以下两种情况:

  • 完全二叉树。从它的根结点开始,按从上而下、自左至右的顺序编号,根结点的编号为1,最后一个结点的编号为n。然后依次把二叉树的结点存放到一组连续的存储单元中,结点编号与存储单元的下标一一对应。
    在这里插入图片描述
  • 非完全二叉树。对于非完全二叉树,先将它补全为一棵完全二叉树,虚补的结点及分支用虚线表示。然后将补全后的完全二叉树,从它的根结点开始,按从上而下、自左至右的顺序编号,根结点的编号为1,最后一个结点的编号为n。依次把完全二叉树中原二叉树的结点存放到一组连续的存储单元中,结点编号与存储单元的下标一一对应。
    非完全二叉树

TIPS:完全二叉树适合用顺序存储结构存储。用顺序存储结构存储非完全二叉树会浪费存储单元。

链式存储

二叉树采用链式存储结构存储时,用任意的一组存储单元来存储二叉树的结点,用指向结点的指针来表达结点之间的关系。

由于二叉树的结点可能有两个孩子,即左孩子和右孩子,因此二叉树的结点至少需要3个域:一个数据域和两个指针域。两个指针域分别指向结点的左孩子和右孩子,这两个指针分别称为左指针和右指针。这样得到的链式存储结构称为二叉链表
二叉链表
在二叉链表中可以从一个结点方便地访问其左孩子和右孩子,并进一步访问其子孙结点。但是,当要访问一个结点的双亲结点,并进一步访问其祖先结点时就比较麻烦。为了解决这个问题,可以在二叉树的结点中增加一个指针域,该指针指向结点的双亲,称为双亲指针。这样得到的链式存储结构称为三叉链表
三叉链表
在二叉树的链式存储结构中,需要给每个结点分配两个或三个指针域以指向其孩子或双亲结点。但是,有些结点只有一个孩子,叶子结点没有孩子,根结点没有双亲,故有些结点的指针域为空指针。在n个结点的二叉链表中,共有n+1个空指针域。在n个结点的三叉链表中,共有n+2个空指针域。

二叉树的运算

  • 建立二叉树
  • 遍历二叉树
    • 无结构方式:将二叉树视作一个图,不考虑其结构特点,使用图的遍历算法
      • 深度优先遍历算法
      • 广度优先遍历算法
    • 层次方式:逐层遍历遍历各层的结点
      • 层次遍历的基本思路是建立一个存放二叉树结点的队列,从根结点开始遍历,当遍历一个结点的时候就把它的左孩子和右孩子加入队尾;队头元素为下一个要遍历的结点;当队列为空时结束遍历。
      • 递归方式
        • 根据二叉树的定义,可以把二叉树分成3个组成部分,即根结点、根结点的左子树、根结点的右子树,然后对这3部分分别进行遍历。根结点的左子树和根结点的右子树又都是二叉树,故又可按照同样的方法对它们进行遍历,这样就形成了对二叉树的递归遍历过程。
        • 若以T、L、R分别代表遍历根结点及其左右子树,则对二叉树的遍历可以有以下6种方案:TLR、LTR、LRT、TRL、RTL、RLT。前面3种和后面3种方案遍历根结点左右子树的顺序刚好相反。如果要求以先左子树后右子树的顺序进行遍历,则只有3种遍历方案:TLR、LTR、LRT。这3种方案分别称为先序遍历、中序遍历和后序遍历。
        • 先序遍历的基本思路:先遍历根结点,其次先序遍历根结点的左子树,最后先序遍历根结点的右子树。
        • 中序遍历的基本思路:先中序遍历根结点的左子树,其次遍历根结点,最后中序遍历根结点的右子树。
        • 后序遍历的基本思路:先后序遍历根结点的左子树,其次后序遍历根结点的右子树,最后遍历根结点。
  • 查找节点
  • 求二叉树深度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值