• C# 二叉树


    http://www.10086bank.com/2013423162259296.html

    6.2.2  二叉树的存储结构

    二叉树的存储可分为两种:顺序存储结构和链式存储结构。

    1.      顺序存储结构

    把一个满二叉树自上而下、从左到右顺序编号,依次存放在数组内,可得到图6.8(a)所示的结果。设满二叉树结点在数组中的索引号为i,那么有如下性质。

    (1) 如果i = 0,此结点为根结点,无双亲。

    (2) 如果i > 0,则其双亲结点为(i -1) / 2 。(注意,这里的除法是整除,结果中的小数部分会被舍弃。)

    (3) 结点i的左孩子为2i + 1,右孩子为2i + 2。

    (4) 如果i > 0,当i为奇数时,它是双亲结点的左孩子,它的兄弟为i + 1;当i为偶数时,它是双新结点的右孩子,它的兄弟结点为i – 1。

    (5) 深度为k的满二叉树需要长度为2 k-1的数组进行存储。

    通过以上性质可知,使用数组存放满二叉树的各结点非常方便,可以根据一个结点的索引号很容易地推算出它的双亲、孩子、兄弟等结点的编号,从而对这些结点进行访问,这是一种存储二叉满二叉树或完全二叉树的最简单、最省空间的做法。

    为了用结点在数组中的位置反映出结点之间的逻辑关系,存储一般二叉树时,只需要将数组中空结点所对应的位置设为空即可,其效果如图6.8(b)所示。这会造成一定的空间浪费,但如果空结点的数量不是很多,这些浪费可以忽略。

    一个深度为k的二叉树需要2 k-1个存储空间,当k值很大并且二叉树的空结点很多时,最坏的情况是每层只有一个结点,再使用顺序存储结构来存储显然会造成极大地浪费,这时就应该使用链式存储结构来存储二叉树中的数据。



    1.      链式存储结构

    二叉树的链式存储结构可分为二叉链表和三叉链表。二叉链表中,每个结点除了存储本身的数据外,还应该设置两个指针域left和right,它们分别指向左孩子和右孩子(如图6.9(a)所示)。

    当需要在二叉树中经常寻找某结点的双亲,每个结点还可以加一个指向双亲的指针域parent,如图6.9(b)所示,这就是三叉链表。



     

    图6.10所示的是二叉链表和三叉链表的存储结构,其中虚线箭头表示parent指针所指方向。



     

    二叉树还有一种叫双亲链表的存储结构,它只存储结点的双亲信息而不存储孩子信息,由于二叉树是一种有序树,一个结点的两个孩子有左右之分,因此结点中除了存放双新信息外,还必须指明这个结点是左孩子还是右孩子。由于结点不存放孩子信息,无法通过头指针出发遍历所有结点,因此需要借助数组来存放结点信息。图6.10(a)所示的二叉树使用双亲链表进行存储将得到图6.11所示的结果。由于根节点没有双新,所以它的parent指针的值设为-1。

  • 相关阅读:
    Java实现分布式锁
    Java中拦截器实、过滤器和监听器的实现原理
    Version 28 (intended for Android Pie and below) is the last version of the legacy support library
    AndroidManifest.xml文件报Activity supporting ACTION_VIEW is not set as BROWSABLE
    flowable 流程图片中文乱码
    java 常用工具类 (值得收藏)
    Oracle 创建表空间和用户脚本
    spring cloud alibaba springboot nacos 版本对应
    Tomcat 配置支持不同的域名访问各自不同程序的配置方法
    flowable 表结构说明
  • 原文地址:https://www.cnblogs.com/chinhi/p/bic.html
Copyright © 2020-2023  润新知