algorithm
  • README
  • 算法题目
    • Page 1
  • 算法基础
    • 堆(大/小顶堆 、优先队列)
      • swift
      • js
      • C++
    • 哈希表(HashTable)
      • 线性探测
        • 稠密哈希表
        • 密集探测哈希表vs线性探测哈希表
      • C拉链法
        • 拉链法是否需要根据负载因子扩容?
      • set的实现
      • map的实现
    • 二叉树
      • 类型
        • AVL树和红黑树的关系与区别比较
      • 存储方式
      • 遍历
        • 前中后序遍历(深度)
          • 递归方式
          • 迭代法
        • 层次遍历(广度)
      • 二叉搜索树
        • 基本概念
        • 代码实现
      • AVL树
        • 基本概念
        • 代码实现
        • 疑问
          • AVL为什么LL的时候右转呢?
          • AVL树中的LR的情况
          • AVL树的调整
          • 删除节点的逻辑
      • 红黑树
        • 基本概念
        • 代码实现
        • 疑问
          • 红黑树和AVL的关系与区别
          • 红黑树和哈希表的关系与区别
          • 为什么有红黑树,比AVL优势在哪里?
    • 运算符
      • 交换两个数(不用临时变量)
  • leetcode结构
    • Javascript
      • 优先队列
    • C++
  • 公司面试题目
    • 汇丰银行
      • 跑步同一个脚印问题
      • 销售系统问题
Powered by GitBook
On this page
  1. 算法基础
  2. 二叉树

类型

1. 满二叉树(Full Binary Tree)

  • 定义:每个节点要么是叶子节点,要么有两个子节点。

  • 特性:所有非叶子节点都有两个子节点,所有叶子节点在同一层,且节点数为 (2^h - 1)((h)为树的高度)。

  • 关系:满二叉树是一种特殊的二叉树,但不一定是搜索树。

2. 完全二叉树(Complete Binary Tree)

  • 定义:除了最后一层外,所有层都被完全填满,且最后一层的节点都集中在左侧。

  • 特性:相较于满二叉树,完全二叉树可以不完全填满最后一层;具有良好的填充性质,便于实现基于数组的表示。

  • 关系:完全二叉树也是一种特殊的二叉树,但不一定是搜索树。

3. 平衡二叉树(Balanced Binary Tree)

  • 定义:任意节点的两个子树的高度差不超过1(如AVL树)。

  • 特性:保证树的高度较小,确保查找、插入和删除操作的时间复杂度为 (O(\log n))。

  • 关系:不要求每个节点都有两个子节点,平衡二叉树通常是二叉搜索树,保持BST的特性和高度平衡(保证操作的效率)。

4. 二叉搜索树(Binary Search Tree, BST)

  • 定义:对于每个节点,左子树的值小于该节点,右子树的值大于该节点。

  • 特性:支持高效的查找、插入和删除操作。

  • 关系:BST可以是满二叉树、完全二叉树或平衡二叉树,但不一定满足所有这些条件。

总结关系与区别

  • 关系:

    • 满二叉树和完全二叉树都是特定形态的二叉树,强调节点的数量和层的填充。满二叉树是完全二叉树的一个特例。

    • 满二叉树和完全二叉树关注树的结构和填充程度,不涉及节点值的大小关系。

    • 平衡二叉树和二叉搜索树关注操作的效率和数据的组织;平衡二叉树和二叉搜索树可以结合使用,例如平衡二叉搜索树(如AVL树或红黑树)同时满足这两种特性。

    • 平衡二叉树和二叉搜索树关注操作的效率与节点值的排列,平衡二叉树保证了较好的高度平衡,而二叉搜索树则强调节点值的排列。

  • 区别:

    • 满二叉树:强调节点的数量,每个非叶子节点有两个子节点。 【数量】

    • 完全二叉树:强调树的填充程度,节点按层填充。【层级】

    • 平衡二叉树:强调树的高度平衡,适用于高效操作。【高度】

    • 二叉搜索树:强调节点值的排列顺序,用于快速查找。【排序】

    • 结构特性:满二叉树和完全二叉树有具体的结构要求,而平衡二叉树和二叉搜索树则强调操作效率和节点值的关系。

    • 性质:平衡二叉树可以是二叉搜索树,但并非所有二叉搜索树都是平衡的;而满二叉树和完全二叉树不一定是搜索树。

    • 操作效率:平衡二叉树专注于操作效率,确保高度较低,便于快速查找,而其他类型则不一定保证这一点。


比较

以下是满二叉树、完全二叉树、平衡二叉树和二叉搜索树的详细区别比较:

特性
满二叉树
完全二叉树
平衡二叉树
二叉搜索树

定义

每个节点都有两个子节点,叶子节点在同一层

除了最后一层外,每一层都完全填满,最后一层节点靠左

左右子树的高度差不超过特定值(如1)

对于每个节点,左子树的值小于根,右子树的值大于根

结构

结构固定

节点数量不固定,最后一层不满时左侧优先。

高度不固定,但保持相对平衡。

高度不固定,可能退化成链表。

节点数量

(2^h - 1)

至少 (2^h) 到 (2^{h+1} - 1)

不固定,取决于具体实现

不固定,取决于插入顺序

高度

最小,高度为 (h)

较小且平衡高度约为 (\log n)

较小,通常为 (\log n)

可能较大,最坏情况下为 (n况下可能不平衡

存储结构

常用数组或链表存储,易于实现

常用数组存储,索引简单(适合实现堆)

链表存储,旋转和调整复杂

链表存储,结构灵活

存储效率

高

高

低(数组表示较难,通常使用链式存储)

低(使用链式存储,易于查找)

查找效率

(O(\log n))

(O(\log n))

(O(\log n))

(O(n))(最坏情况下)

插入/删除效率

(O(n))(需维持满的状态:若不维持满,效率高O(1))

(O(\log n))

(O(\log n))

(O(n))(最坏情况下)

例子

完全填充的树

堆(如二叉堆)

AVL树、红黑树

普通二叉搜索树

应用场景

用于实现完全填充的树形结构

适合用于堆和优先队列实现。

用于需要高效查找和动态数据的场景。

用于需要快速查找、插入和删除的场景。

主要用途

适用于固定大小的完全填充树

适合堆和优先队列实现

提高查找和修改操作效率

快速查找、插入和删除操作

总结

  • 满二叉树和完全二叉树侧重于树的结构和填充方式。但满二叉树对每个节点的子节点数量有严格要求。

  • 平衡二叉树关注于高度平衡以优化性能。

  • 二叉搜索树强调节点值的排序特性;但可能在某些情况下变得不平衡。

Previous二叉树NextAVL树和红黑树的关系与区别比较

Last updated 7 months ago