【数据结构】二叉树

二叉树

二叉树是计算机科学中一种重要的树形数据结构,被广泛应用于各种算法和系统设计中。

什么是二叉树?

二叉树是一种树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的根节点是树的起点,其他节点通过根节点及其子节点逐层连接形成树状结构。

基本术语:

  • 节点(Node):二叉树的基本元素,每个节点包含一个数据元素以及指向其左右子节点的指针。

  • 根节点(Root Node):树的起点节点。

  • 叶子节点(Leaf Node):没有子节点的节点。

  • 子树(Subtree):以某个节点为根的树。

二叉树的类型

根据节点的排列方式和性质,二叉树可以分为多种类型:

  1. 满二叉树(Full Binary Tree)

    • 每个节点要么没有子节点,要么有两个子节点。
  2. 完全二叉树(Complete Binary Tree)

    • 除了最后一层外,每一层的节点都是满的,且最后一层的节点从左到右依次排列。
  3. 二叉搜索树(Binary Search Tree, BST)

    • 对于任意节点,其左子树所有节点的值都小于该节点的值,其右子树所有节点的值都大于该节点的值。
  4. 平衡二叉树(Balanced Binary Tree)

    • 任意节点的左子树和右子树的高度差不超过1。
二叉树的基本操作
  1. 遍历

    • 前序遍历(Preorder Traversal):先访问根节点,再访问左子树,最后访问右子树。
    • 中序遍历(Inorder Traversal):先访问左子树,再访问根节点,最后访问右子树。
    • 后序遍历(Postorder Traversal):先访问左子树,再访问右子树,最后访问根节点。
    • 层次遍历(Level-order Traversal):按层次逐层访问节点。
  2. 插入

    • 将新节点插入二叉树中,需保证树的结构和性质不变(如二叉搜索树需要保证插入后仍是BST)。
  3. 删除

    • 从二叉树中删除指定节点,并调整树的结构以保持性质(如删除BST节点时需找到合适的替代节点)。
  4. 查找

    • 查找树中是否包含指定值的节点(在BST中查找效率较高)。
二叉树的应用
  1. 搜索和排序

    • 二叉搜索树用于高效查找、插入和删除操作。
    • 平衡二叉树如AVL树和红黑树用于保持树的高度平衡,确保操作的时间复杂度为O(log n)。
  2. 表达式解析

    • 表达式树用于解析和计算数学表达式。
  3. 数据压缩

    • 哈夫曼树用于数据压缩算法,如哈夫曼编码。
  4. 网络路由

    • 路由表可以使用二叉树结构高效存储和查找路由信息。

二叉树的节点性质

1. 节点数量
  • 满二叉树 :如果一棵二叉树的所有非叶子节点都有两个子节点,并且所有叶子节点都在同一层,则这棵二叉树是满二叉树。对于高度为 ( h ) 的满二叉树,其节点总数 ( n ) 可以表示为:

    n = 2\^{h+1} - 1

  • 完全二叉树 :如果一棵二叉树除了最后一层可能不满外,其它层的节点数达到最大,并且最后一层的节点都连续集中在最左边,则这棵二叉树是完全二叉树。对于节点总数为 ( n ) 的完全二叉树,其高度 ( h ) 可以表示为:

    h = log_2 n

2. 高度和深度
  • 节点的深度:节点的深度是指从根节点到该节点所经历的边的数量。根节点的深度为0。

  • 节点的高度:节点的高度是指从该节点到最远叶子节点的最长路径上的边的数量。叶子节点的高度为0。

  • 树的高度:树的高度是指根节点的高度,即整棵树中节点的最大高度。对于高度为 ( h ) 的二叉树,其最大节点数为 ( 2^{h+1} - 1 ),最小节点数为 ( h + 1 )。

3. 层次
  • 节点的层次:节点的层次从根节点开始计算,根节点为第1层,根节点的子节点为第2层,以此类推。第 ( i ) 层最多有 ( 2^{i-1} ) 个节点。
4. 二叉树的性质
  1. 第 ( i ) 层的节点数最多为 ( 2^{i-1} )

  2. 高度为 ( h ) 的二叉树最多有 ( 2^{h+1} - 1 ) 个节点

  3. 包含 ( n ) 个节点的完全二叉树的高度为 ( log_2 n )

  4. 若叶子节点数为 ( n_0 ),度为2的节点数为 ( n_2 ),则 ( n_0 = n_2 + 1 )

5. 完全二叉树的性质
  • 节点的编号:对于完全二叉树中的任意节点,若用数组表示,节点编号从1开始,第 ( i ) 个节点的左子节点编号为 ( 2i ),右子节点编号为 ( 2i + 1 ),父节点编号为 (i / 2)。

  • 叶子节点的数量:对于具有 ( n ) 个节点的完全二叉树,其叶子节点的数量为 ( n / 2 )。

相关推荐
CSharp精选营20 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假4 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠5 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦12 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠13 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾13 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82113 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q13 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒13 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记13 天前
单项不带头不循环链表
数据结构·链表