跳转至

EA2-递归遍历

二叉树的递归遍历是数据结构中的基础操作,主要包括前序遍历中序遍历后序遍历。下面给出完整的C语言实现。

三种递归遍历实现

1. 前序遍历(根-左-右)

C
// 前序遍历:根 -> 左子树 -> 右子树
void preorderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }

    printf("%d ", root->data);        // 访问根节点
    preorderTraversal(root->left);    // 遍历左子树
    preorderTraversal(root->right);   // 遍历右子树
}

2. 中序遍历(左-根-右)

C
// 中序遍历:左子树 -> 根 -> 右子树
void inorderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }

    inorderTraversal(root->left);     // 遍历左子树
    printf("%d ", root->data);        // 访问根节点
    inorderTraversal(root->right);    // 遍历右子树
}

3. 后序遍历(左-右-根)

C
// 后序遍历:左子树 -> 右子树 -> 根
void postorderTraversal(TreeNode* root) {
    if (root == NULL) {
        return;
    }

    postorderTraversal(root->left);   // 遍历左子树
    postorderTraversal(root->right);  // 遍历右子树
    printf("%d ", root->data);        // 访问根节点
}

遍历过程可视化

graph TD
    A[1] --> B[2]
    A --> C[3]
    B --> D[4]
    B --> E[5]

    style A fill:#f9f,stroke:#333
    style B fill:#bbf,stroke:#333
    style C fill:#bbf,stroke:#333
    style D fill:#bfb,stroke:#333
    style E fill:#bfb,stroke:#333

遍历顺序说明: - 前序:1 → 2 → 4 → 5 → 3 - 中序:4 → 2 → 5 → 1 → 3
- 后序:4 → 5 → 2 → 3 → 1

算法分析

时间复杂度

  • 时间复杂度:O(n),其中n是二叉树的节点数,每个节点恰好被访问一次
  • 空间复杂度:O(h),其中h是二叉树的高度,主要是递归调用栈的空间开销
  • 最坏情况(退化为链):O(n)
  • 最好情况(完全二叉树):O(log n)

递归执行过程(以前序为例)

Text Only
preorder(1)
├── print(1)
├── preorder(2)
│   ├── print(2)
│   ├── preorder(4)
│   │   ├── print(4)
│   │   └── return
│   ├── preorder(5)
│   │   ├── print(5)
│   │   └── return
│   └── return
├── preorder(3)
│   ├── print(3)
│   └── return
└── return