zoukankan      html  css  js  c++  java
  • 二叉树(三)

    二叉树效率:

    在查找过程中,需要访问每层的一个节点,所以只要知道有多少层就知道操作多长时间。假设是一个满树:如表中显示

         节点数          层 数    
            1         1
            3       2
            7       3
           15        4
           31       5
         1023      10

    假设第一列的节点个数为N,第二列层数为L,则 N 比 2 的L次方少一。
    N = 2L - 1   -->    L = log2(N + 1)

    因此,常见的树的操作时间大致都是 N 以 2 为底的对数,在大O表示法中,表示为 O( logN )

    如果树不满,分析起来就很困难。不过,可以认为对给定层数的树,不满的树的平均查找时间肯定比满树的要短,因为它在较低的层上完成查找的次数比满树时少。

    树与其它数据结构的比较:

    1)在有1000000个数据项的无序数组或者链表中,查找数据项的平均比较是500000次,但在1000000个节点的二叉树中,只需要20或更少( 通过log2(N + 1) 算出来)的比较。有序数组可以更快的找到数据项,但是插入数据项平均要移动500000个数据项,在1000000个节点的树插入数据项需要20或更少的比较,再加上很段的时间连接数据项。

    2)在删除二叉树中,也是仅需要20次或更少的比较找到它,再加上一点时间找到它的后继,一点时间断开它的后继,以及连接它的后继。

    因此,树对常有的数据结构存储操作都有很高的效率。

    小结:

    1)树是由边连接的节点组成的。

    2)根是树最顶端的节点,没有父节点。

    3)二叉树中,节点最多只有两个子节点。

    4)二叉搜索树中,所有A节点的左边子孙节点的关键字都比A小,所有右边子孙节点的关键字都比A大。

    5)树执行查找,插入,删除的时间复杂度都是 O(N)

    6)节点表示保存在树中的对象。

    7)查找节点需要比较关键值和节点的关键值,如果比节点关键值小则转向左边,其它则转向右边。

    8)插入需要找到插入新节点的位置并且由它的父节点的子字段指向它。

    9)中序遍历是按关键值升序访问节点的。

    10)前序、后序遍历对解析代数表达式有用。

    11)如果一个节点没有子节点,删除它只要把它的父节点的子字段设置为null即可。

    12)如果一个节点只有一个子节点,删除它只要把它的子节点替换为它即可。

    13)如果一个节点有两个子节点,删除它要用它的后继替换它。

    14)在删除有两个子节点的节点中,会根据后继是被删节点的右子节点 还是 右子节点的左子孙节点的两个情况。

  • 相关阅读:
    Django学习笔记(16)——扩展Django自带User模型,实现用户注册与登录
    Django学习笔记(15)——中间件
    JAVA—API和SPI概念
    mybatis 映射器(mappers) 配置说明 加载映射文件方式
    Java的三种代理模式
    如何选择分布式事务形态(TCC,SAGA,2PC,补偿,基于消息最终一致性等等)
    什么是分布式系统中的幂等性
    js date 前一天
    getCanonicalFile与getAbsoluteFile区别
    Mybatis 示例之 SelectKey
  • 原文地址:https://www.cnblogs.com/xuekyo/p/2780744.html
Copyright © 2011-2022 走看看