zoukankan      html  css  js  c++  java
  • 大话数据结构 -06 树

    一、普通树

    树中的节点是一对多的关系。具有以下特点: 

    1. n>0时,根节点是唯一的,不可能存在多个根节点。

    2. 每个节点有零个至多个子节点;除了根节点外,每个节点有且仅有一个父节点。根节点没有父节点。

    相关概念:

    1. 子树:除了根节点外,每个子节点都可以分为多个不相交的子树。
    2. 孩子与双亲:若一个结点有子树,那么该结点称为子树根的"双亲",子树的根是该结点的"孩子"。
    3. 兄弟:具有相同双亲的节点互为兄弟。
    4. 节点的度:一个节点拥有子树的数目。等价与该节点拥有孩子的数目。(子树个数=孩子节点树的度=各个节点度的最大值
    5. 叶子:没有子树,也即是度为0的节点。
    6. 分支节点:除了叶子节点之外的节点,也即是度不为0的节点。
    7. 内部节点:除了根节点之外的分支节点。(非根节点、非叶节点
    8. 层次:根节点为第一层,其余节点的层次等于其双亲节点的层次加1.
    9. 树的高度:也称为树的深度,树中节点的最大层次。
    10. 有序树:树中节点各子树之间的次序是重要的,不可以随意交换位置。
    11. 无序树:树中节点各子树之间的次序是不重要的。可以随意交换位置。
    12. 森林:0或多棵互不相交的树的集合。

    参考:https://www.cnblogs.com/QG-whz/p/5168620.html

    性质:

    「1」树的结点无左、右之分,最大度数没有限制。

    「2」树的结点个数至少为1,而二叉树的结点个数可以为0。

    二、二叉树

    二叉树或者为空集,或者由一个根节点和两棵互不相交的、分别称为左子树和右子树的二叉树组成。从定义可以看出一棵二叉树:

    1. 二叉树是有序树,区分左子树与右子树,不可以随意交换子树位置。

    2. 一个节点的子树数量取值范围为0,1,2。0代表该节点是叶子节点,1代表该节点只有左子树或只有右子树,2代表该节点有左右子树。

    参考:https://www.cnblogs.com/QG-whz/p/5168620.html

    性质:

    「1」二叉树的子树有左右之分,次序不能颠倒。

    「2」深度为k的二叉树至多有2^k-1个结点;(等比数列1+2+4+…+2^(k-1) = 2^k-1)。

    「3」对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + 1。

    证明:二叉树节点度数最大为2,则 : n = n0 + n1 + n2 (等式一)
    从孩子个数角度出发: 度为0的节点没有孩子, 度为1的节点没有1个孩子,度为2的节点有2个孩子,孩子总数为 n00 + n11 +n2 2 = n1+2n2;树的所有节点中,只有根不是任何节点的孩 子,因此有 n -1 = n1 + 2* n2 ,即 n = n1 + 2* n2 + 1. (等式二)
    由等式一等式而可以推出 n0 = n2 +1

     「4」具有n个节点的完全二叉树的高度为至少为log2(n+1)

    证明:高度为h的二叉树最多有2{h}–1个结点。反之,对于包含n个节点的二叉树的高度至少为log2(n+1)。

     「5」如果对一棵有n个节点的完全二叉树的节点按层序编号(从第一层开始到最下一层,每一层从左到右编号),对任一节点i有:

    1. 如果i=1 ,则节点为根节点,没有双亲。如果i>1,则其双亲是结点「i/2」
    2. 如果2 * i > n ,则节点i没有左孩子 ;否则其左孩子节点为2*i . (n为节点总数)
    3. 如果2 * i+1>n ,则节点i没有右孩子;否则其右孩子节点为2*1+1

    满二叉树:

    一颗深度为k且有2^k-1个结点的二叉树称为满二叉树。 即:除叶子结点外的所有结点均有两个子结点。节点数达到最大值。所有叶子结点必须在同一层上。

    节点数和深度的关系 n=2^k-1

    性质:

    「1」如果一颗树深度为h,最大层数为k,且深度与最大层数相同,即k=h;

    「2」第k层的结点数是: 2^(k-1)

    「3」总节点数一定是奇数

    「4」树高:h=log2(n+1)。

    参考:https://www.cnblogs.com/myjavascript/articles/4092746.html

     完全二叉树:

     若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边(在最后一层上只缺少右边的若干结点),这就是完全二叉树。

    节点数的范围是2^(k-1)-1<N<=2^k-1

    与满二叉树的区别是,他的最后一行可能不是完整的,但绝对是右方的连续部分缺失。

    参考:https://www.cnblogs.com/mapc/articles/4842256.html

     性质:

    「1」 树高h=「log2n」 + 1。(「x」表示不大于x的整数)

    「2」同样节点数的二叉树,完全二叉树的深度最小。(*满二叉树与完全二叉树深度一样 *其他的二叉树大于等于完全二叉树)

    三、树的存储结构(三种)

    1)双亲表示法

    2)孩子表示法

    3)孩子兄弟表示法:把一颗复杂的树处理成二叉树

    具体:https://www.jianshu.com/p/6ba5743f41f7

    四、二叉树的存储结构

    1)顺序存储结构(一般只用于完全二叉树,非完全浪费空间)

     2)二叉链表

     二叉树每个结点最多有两个孩子,因此设计一个数据域和两个指针域

    五、遍历二叉树

    1)前序遍历(树为空直接返回)(跟结点在前)

    前序遍历算法

    2)中序遍历(根结点在中间)

    中序遍历算法

    3)后序遍历(根结点最后)

    后序遍历算法

    4)层序遍历

     5)推导遍历结果

    六、二叉树的建立

    七、线索二叉树

    对于一个有n个结点的二叉链表,每个结点有左右两个指针域,一共有2n个指针域。而n个结点的二叉树有n-1条分支线,即:共有2n-(n-1)=n+1个空指针域。

     因此,提出了一种方法,利用原来的空链域存放指向前驱或后继的指针,这种指向前驱或后继的指针称为线索。加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。

    线索二叉树相当于把 一颗二叉树变成了双向链表。即:在遍历过程中修改空指针的过程。

    线索二叉树的结构实现:

    中序遍历线索化递归代码:(???)

    上述代码除了加粗字体外,与中序遍历递归代码几乎一致,将原本是打印结点的功能改成了线索化的功能

    (P216/192...)

  • 相关阅读:
    JSON 序列化类 南京酷得软件
    哈哈哈哈哈哈 找回记忆
    Presto
    (转)在Total Commander下使用SVN
    在ubuntu12.04,64位中安装lnmp一键包mysql的问题
    阿里云服务器上搭建php环境+redis
    在ubuntu12.04,64位中安装nginx+php+redis+mysql
    Redis篇:单线程I/O模型
    工具篇:apachehttpClient 和 jdk11HttpClient的使用
    技能篇:关于缓存数据的一致性探讨
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/9981353.html
Copyright © 2011-2022 走看看