二叉树是每个节点最多有两个子树(左、右子树)且子树有左右次序的数据结构,是树形结构中最基础且应用极广的类型。本文将从核心概念、特性、遍历、实现与应用等方面展开介绍

一、核心概念与定义

定义:n 个节点的有限集合,或为空,或由根节点 + 两棵互不相交的左/右子树组成,子树次序不可颠倒(有序树。

基本术语

  1. 根节点:树的顶层节点,无父节点。
  2. 叶子节点:无左右子树的节点。
  3. 深度/高度:根到节点的层数为深度,节点到叶子的最大层数为高度。
  4. 度:节点拥有的子树数(二叉树节点度≤2)。

    二、特殊二叉树类型

  5. 满二叉树:特征为每层节点数达最大值(深度k有2^k-1个节点),可在完全二叉树的基础模型中应用。
  6. 完全二叉树:特征为除最后一层外均满,最后一层从左到右连续填充,可在堆排序、优先队列中运用。
  7. 二叉搜索树(BST):特征为左子树节点值<根,右子树节点值>根,子树均为BST,可应用在在动态查找、排序等。
  8. 平衡二叉树(AVL):特征为左右子树高度差≤1,子树均平衡,可解决 BST 退化为链表问题。

    三、重要性质

  9. 第i层最多有2^(i-1)个节点(根为第 1 层)。
  10. 深度为h的二叉树最多有2^h-1个节点。
  11. 叶子节点数n0=度为2的节点数n2+1。
  12. n个节点的完全二叉树深度为⌊log₂n⌋+1。

    四、遍历方式(含代码示例)

    遍历是访问所有节点的过程,核心有 4 种方式,以下以 C 语言实现二叉树节点定义与递归遍历。

    节点定义

    typedef struct TreeNode
    {
     int data;
     struct TreeNode* left;
     struct TreeNode* right;
    } TreeNode;

    遍历实现

  13. 前序遍历(根→左→右)

    void preOrder(TreeNode* root) 
    {
     if (root) 
     {
         printf("%d ", root->data);
         preOrder(root->left);
         preOrder(root->right);
     }
    }
  14. 中序遍历(左→根→右)

    void inOrder(TreeNode* root) 
    {
     if (root) 
     {
         inOrder(root->left);
         printf("%d ", root->data);
         inOrder(root->right);
     }
    }
  15. 后序遍历(左→右→根)

    void postOrder(TreeNode* root) 
    {
     if (root) 
     {
         postOrder(root->left);
         postOrder(root->right);
         printf("%d ", root->data);
     }
    }
  16. 层序遍历(按层访问):借助队列实现,适用于树的广度优先搜索。

    五、存储结构

  17. 顺序存储:用数组按层序存储完全二叉树,父节点i的左孩子为2i,右孩子为2i+1,适合完全二叉树。
  18. 链式存储:每个节点含数据域和左右指针,灵活适配各类二叉树,是最常用存储方式。

    六、应用场景

  19. 数据检索:BST、AVL树支持高效增删查(平均O(logn))。
  20. 表达式解析:二叉树表示算术表达式(运算符为根,操作数为叶子)。
  21. 路径规划:决策树、哈夫曼树用于数据压缩。
  22. 堆结构:基于完全二叉树实现优先队列。

久远寺门邸
1 声望0 粉丝

引用和评论

0 条评论