• 数据结构:树和二叉树


    一、树的定义和基本术语

    • 把数据元素称为结点
    • 树是n(n>=0)个结点的有限集合。n=0时称为空树。
    • 有且仅有一个根节点。n>1时,除了根结点之外的其余结点被分成m棵互不相交的子树。
    • 结点的度:某结点拥有的子树的个数。
    • 树的度:每个结点的度的最大值

    树的存储结构

    双亲表示法

    用一维数组来存储这棵树。每个结点元素存了自己的数据信息和双亲结点的下标。

    孩子表示法

    是一种基于链表的存储方法。有:

    1. 多重链表表示法
      就是一个节点元素有一个数据域,存自己的信息;还有好几个指针域,指向他们的孩子
    2. 孩子链表表示法
      每个结点的孩子们给弄成一个链表,n个结点就有n个链表。这个是孩子链表。
      然后还有表头,就是那n个结点。表头有数据域和firstchild指针指向第一个结点

    双亲孩子表示法

    将孩子链表表示法和双亲孩子表示法相结合。在孩子链表表示法的基础上,再增添一个数据元素用来存储双亲的下标。

    孩子兄弟表示法

    一个结点中,一个数据域,一个指针域存第一个孩子,一个指针域存右兄弟。

    二叉树的逻辑结构

    1.定义

    • 二叉树的每个结点最多有两棵子树
    • 二叉树是有序的
    • 满二叉树:叶子(度为0)只能出现在最下一层、只有度为0和度为2的结点
    • 完全二叉树:叶子结点只能出现在最下两层、最下层的叶子结点都集中在二叉树的左侧;如果有度为1的结点,只能有一个,且该结点只有左孩子。(请查找一个图来看)

    2.二叉树的基本性质

    1. 二叉树的第i层上最多有2
    ^i-1 个结点(1,2,4,8...)

    2. 在一棵深度为k的二叉树中,最多有2^k -1 个结点,最少有k个结点。(1+2+4+8...)
    3. 在一棵二叉树中,如果叶子结点的个数为n0,度为2的结点个数为n2,则:n0 = n2 + 1
    4. 具有n个结点的完全二叉树的深度为log2 n (向下取整) + 1
    5. 对一棵具有n个结点的完全二叉树中的结点,从1开始按层序编号,则对于任意编号i(1<=i<=n)的结点,有:
    如果结点i有左孩子,左孩子为2i;如果结点i有右孩子,右孩子为2i+1;如果结点i有双亲,那么双亲编号为i/2(向下取整)。

    3.二叉树的遍历操作

    前序、中序、后序、层序

    二叉树的存储结构及实现

    1.顺序存储结构。

    把二叉树当成一颗完全二叉树来编号,这样可以从下反映出父子关系。但是这样浪费空间。

    2.二叉链表

    一个结点中,有一个数据域,一个指针域指向左孩子,一个指针域指向右孩子。

    template<class D>
    struct BiNode
    {
        D data;//数据
        BiNode<D> *lchild,*rchild;
    };
    
  • 相关阅读:
    现有某电商网站用户对商品的收藏数据,记录了用户收藏的商品id以及收藏日期,名为buyer_favorite1。 buyer_favorite1包含:买家id,商品id,收藏日期这三个字段,数据以“ ”分割
    面向对象程序设计中类与类的关系都有哪几种?分别用类图实例说明。
    Java为什么没有指针
    touchz,mkdir,vi的区别
    session使用方法
    迪杰斯特拉算法-文档读取数据
    数据结构---公交线路提示系统(Java后台+excel表格+web前端)
    caffe中train过程的train数据集、val数据集、test时候的test数据集区别
    caffe程序中出现的db.cpp:#line(行号) unknown database backend问题
    caffe的cancat层
  • 原文地址:https://www.cnblogs.com/juzijuziju/p/11880305.html
Copyright © 2020-2023  润新知