zoukankan      html  css  js  c++  java
  • 数据结构之树

    本质问题

    不是线性表,是一种描述非线性层次关系的数据结构。描述的是一对多的数据结构。

    1. 树的定义

    树(Tree)的基本概念
    树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。

    2. 基本特征

    • 有且仅有一个结点没有直接前驱,那就是根节点。
    • 除了根结点外,其他结点有且仅有一个直接前驱。
    • 每个结点可以有任意后继结点。

    3. 基本概念

    • 兄弟结点——拥有同一个父结点的结点。
    • 孩子、双亲——结点的子树的根称为该节点的孩子,相应地,该节点称为孩子的双亲。
    • 结点的度——一个结点所包含子树的数量。
    • 树的度——该树所有结点中最大的度。
    • 叶子结点——树中度为零的结点,也叫终端结点。
    • 结点的层数——从根结点开始算,根结点是第一层,依次往下。
    • 树的深度——树中结点的最大层数
    • 有序树——树中的各结点的子树(兄弟结点) 从左到右按一定次序去排列的树。
    • 森林——m(m>=0)棵互不相交的树的集合。

    4. 树的种类

    • 无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树;
    • 有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树;
    • 二叉树:每个节点最多含有两个子树的树称为二叉树;
      • 完全二叉树
      • 满二叉树
      • 斜树
      • 平衡二叉树
    • 霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;
    • 二叉搜索树

    5. 二叉树

    • 特点:
      • 每个结点最多只有两个子结点,可以没有或者只有一个。
      • 左子树和右子树是有顺序的,次序不能任意颠倒。
    • 分类:
      • 斜树:所有节点都只有左子树的二叉树叫做左斜树,所有节点都只有右节点的二叉树叫做右斜树,这两者统称为斜树。
      • 满二叉树:除了最下面一层的叶子结点外,其他结点都有两个子结点;
      • 完全二叉树:除了最下面一层的叶子结点外,其他各层结点数达到最大个数,而且最后一层叶子结点按照从左到右的顺序连续存在,只缺最后一层若干结点;

    6. 二叉树的性质

    • 性质1:在二叉树的第i层上至多有2^i^-1个节点(i >= 1)

    • 性质2:深度为k的二叉树至多有2^k^-1个节点(k >=1)

    • 性质3:对于任意一棵二叉树T而言,其叶子节点数目为N~0~,度为2的节点数目为N~2~,则有N~0~ = N~2~ + 1。

    • 性质4:具有n个节点的完全二叉树的深度(log~2~n)+1(括号内的值取下限)。

    • 性质5:一棵完全二叉树,其深度为,节点编号按层编号,每层从左至右编号,则对任意节点i(1<= i <= n)

      • (1) 如果i = 1,则该点为根节点,无双亲,否则其双亲为(i/2)(括号内的值取下限);
      • (2) 如果2i>0,则该点无左孩子(节点为叶子节点),否则其左孩子为2i;
      • (3) 如果2i+1,则该点无右孩子,否则其左孩子为2i+1;

    7. 存储方式

    • 二叉树的顺序存储结构:

      • 二叉树的顺序存储结构用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要体现出结点之间的逻辑关系。
      • 就是从根结点开始一层层地按顺序存储在数组里,但是只适用于完全二叉树,因为非完全二叉树的话,可能会浪费大量的存储空间。
      • 代码实现
    • 二叉链表:

      • 因为二叉树最多有两个孩子,所以二叉链表拥有一个数据域和两个指针域。
      • 如果有需要还可以再增加一个指向其双亲的指针域,那就称为三叉链表。
      • 代码实现

    8. 二叉树的遍历

    • 先序:先访问根结点,后是左子树,到右子树;
    • 中序:先左子树,后根结点,最后是右子树;
    • 后序:先左子树,后右子树,最后根结点;
    • 层序:从上到下,从左到右依次遍历每一层中的每一个节点。
  • 相关阅读:
    Solr4.8.0源码分析(12)之Lucene的索引文件(5)
    JAVA基础(1)之hashCode()
    Solr4.8.0源码分析(11)之Lucene的索引文件(4)
    检查数据不一致脚本
    索引的新理解
    数据库放到容器里
    动态规划
    每天晚上一个动态规划
    postgresql parallel join example
    名不正,则言不顺
  • 原文地址:https://www.cnblogs.com/chengmf/p/12454585.html
Copyright © 2011-2022 走看看