二叉树是每个节点最多有两个子树(左、右子树)且子树有左右次序的数据结构,是树形结构中最基础且应用极广的类型。本文将从核心概念、特性、遍历、实现与应用等方面展开介绍一、核心概念与定义
定义:n 个节点的有限集合,或为空,或由根节点 + 两棵互不相交的左/右子树组成,子树次序不可颠倒(有序树。
基本术语
- 根节点:树的顶层节点,无父节点。
- 叶子节点:无左右子树的节点。
- 深度/高度:根到节点的层数为深度,节点到叶子的最大层数为高度。
度:节点拥有的子树数(二叉树节点度≤2)。
二、特殊二叉树类型
- 满二叉树:特征为每层节点数达最大值(深度k有2^k-1个节点),可在完全二叉树的基础模型中应用。
- 完全二叉树:特征为除最后一层外均满,最后一层从左到右连续填充,可在堆排序、优先队列中运用。
- 二叉搜索树(BST):特征为左子树节点值<根,右子树节点值>根,子树均为BST,可应用在在动态查找、排序等。
平衡二叉树(AVL):特征为左右子树高度差≤1,子树均平衡,可解决 BST 退化为链表问题。
三、重要性质
- 第i层最多有2^(i-1)个节点(根为第 1 层)。
- 深度为h的二叉树最多有2^h-1个节点。
- 叶子节点数n0=度为2的节点数n2+1。
n个节点的完全二叉树深度为⌊log₂n⌋+1。
四、遍历方式(含代码示例)
遍历是访问所有节点的过程,核心有 4 种方式,以下以 C 语言实现二叉树节点定义与递归遍历。
节点定义
typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode;遍历实现
前序遍历(根→左→右)
void preOrder(TreeNode* root) { if (root) { printf("%d ", root->data); preOrder(root->left); preOrder(root->right); } }中序遍历(左→根→右)
void inOrder(TreeNode* root) { if (root) { inOrder(root->left); printf("%d ", root->data); inOrder(root->right); } }后序遍历(左→右→根)
void postOrder(TreeNode* root) { if (root) { postOrder(root->left); postOrder(root->right); printf("%d ", root->data); } }层序遍历(按层访问):借助队列实现,适用于树的广度优先搜索。
五、存储结构
- 顺序存储:用数组按层序存储完全二叉树,父节点i的左孩子为2i,右孩子为2i+1,适合完全二叉树。
链式存储:每个节点含数据域和左右指针,灵活适配各类二叉树,是最常用存储方式。
六、应用场景
- 数据检索:BST、AVL树支持高效增删查(平均O(logn))。
- 表达式解析:二叉树表示算术表达式(运算符为根,操作数为叶子)。
- 路径规划:决策树、哈夫曼树用于数据压缩。
- 堆结构:基于完全二叉树实现优先队列。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。