算法和数据结构(树)- 树和二叉树简介

树和二叉树

  1. 除了线性结构的数组,链表,栈和队列外,还有一些非线性机构,如树和图

  2. 生活里的树形结构:族谱,职位关系,课本的章节目录

  3. 树的定义:

    • 树是n( n ≥ 0 n \ge 0 n0)个节点的有限集。当n=0时,称为空树。任意一个非空树有如下特点
      1. 有且仅有一个特定的称为根的节点
      2. 当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每个集合本身又是一个树,称为根的子树
  4. 一些概念:

    在这里插入图片描述

    • 根节点
    • 叶子节点
    • 子树
    • 父节点
    • 兄弟节点
    • 孩子节点
    • 树的高度

二叉树简介

  1. 定义:树的每个节点最多有2个孩子节点。

    • 可能1个孩子,可能没有。
    • 左孩子,右孩子,顺序固定
  2. 两种特殊形式:满二叉树和完全二叉树

    • 满二叉树:一个二叉树的所有非叶子节点都有左右孩子,并且所有叶子几点都在一个层级。

      • 就是每个分支都是满的
    • 完全二叉树:对一个有n个节点的二叉树,按层级顺序编号,从1到n。如果这个树所有节点和同深度的满二叉树的编号从1到n节点位置相同。则这棵树为完全而二叉树。

      在这里插入图片描述

    • 总结:满二叉树要求更严:满二叉树所有分支都满着,且叶子节点都在一层。完全二叉树只要保证最后一个节点之前的节点都齐全即可。

  3. 二叉树如何存储

    • 链式存储
      二叉树的每个节点都包含3个部分

      • 存储数据的data变量

      • 指向左孩子的left指针

      • 指向有孩子的right指针

        在这里插入图片描述

    • 数组存储

      按照层级顺序把二叉树的节点放到数组中的对应位置,如果有左右孩子空缺,那对应的数组也空缺。这样更方便定位孩子节点和父节点。

      • 找孩子节点:父节点下标时 p a r e n t parent parent,则左孩子小标为 2 × p a r e n t + 1 2 \times parent +1 2×parent+1;右孩子下标为 2 × p a r e n t + 2 2 \times parent +2 2×parent+2
      • 左孩子下标是 l e f t C h i l d leftChild leftChild,那父节点下标就是 ( l e f t C h i l d − 1 ) / 2 (leftChild - 1)/2 leftChild1/2
      • 孩子少时很浪费空间,那什么样的二叉树适合数组存储呢?
        • 后面的二叉堆,一种特殊的完全二叉树,就是数组存储
  4. 二叉树应用:查找操作和维持相对顺序

    • 查找操作

      二叉查找树:在二叉树的基础上加了以下几个条件:

      • 如果左子树不空,则左子树上所有节点的值均小于根节点的值
      • 如果右子树不空,则右子树上所有节点的值均大于根节点的值
      • 左右子树也是二叉查找树

      总结:和根节点比,方便查找,如果节点分布相对均匀,则时间复杂度为O(logn)。与二分法类似

    • 维持相对顺序

      二叉查找树有另一个名字:二叉排序树

      • 插入元素时和根节点比较
      • 可能导致不平衡,需要自平衡方式
      • 红黑树,AVL树等方式
      • 二叉堆也有一定的顺序,后面详解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值