二叉树

二叉树入门:层次与深度的艺术

当我们掌握了链表这条“线”,自然就遇到了树这张“网”。链表是一对一的线性关系,而树则展现了一对多的层次关系,它就像公司的组织架构图或家族的族谱,是数据结构从线性迈向非线性的关键一步。

二叉树的基本结构

二叉树是每个节点最多有两个“孩子”的树,分别称为左子树和右子树。这个简单的限制带来了清晰的逻辑和巨大的威力。

struct TreeNode {
    int val;
    TreeNode *left;  // 指向左子树的“指针”
    TreeNode *right; // 指向右子树的“指针”
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

为什么需要二叉树?

二叉树为数据提供了天然的层次化组织方式。这种结构使得数据的搜索、插入和删除操作在平均情况下可以达到O(log n)的效率,远快于链表的O(n)。它是高效算法(如快速查找、排序)和高级数据结构(如AVL树、堆)的基石。

核心:二叉树的遍历

遍历是访问树中每个节点的关键。根据访问根节点的时机,分为三种经典方式:

  • 前序遍历:根 -> 左 -> 右。常用于复制整棵树。
  • 中序遍历:左 -> 根 -> 右。对二叉搜索树使用时,能按升序输出所有值。
  • 后序遍历:左 -> 右 -> 根。常用于安全地删除树或计算子树特征。
// 中序遍历的递归实现(简洁体现了分治思想)
void inorderTraversal(TreeNode* root) {
    if (root == nullptr) return;
    inorderTraversal(root->left); // 先征服左子树
    cout << root->val << " ";     // 再访问根
    inorderTraversal(root->right);// 最后征服右子树
}

二叉树的应用场景

文件系统的目录结构、编译器中抽象语法树的表示、决策树算法,甚至游戏中的剧情分支,都隐含着树形结构。而二叉搜索树更是将数据有序存储,奠定了数据库索引的基础思想。

总结

理解二叉树,就是理解了“分而治之”的递归思想在数据结构中的直观体现。

posted @ 2026-01-06 08:22  f-52Hertz  阅读(23)  评论(0)    收藏  举报