580 字
3 分钟
二叉树的遍历
前言:
什么是二叉树遍历?
遍历就是“按照一定的顺序访问树中的每一个节点”,常见顺序包括:
- 前序遍历(根 → 左 → 右)
- 中序遍历(左 → 根 → 右)
- 后序遍历(左 → 右 → 根)
- 层序遍历(一层一层访问,从上到下,从左到右)
我们重点讲解前、中、后序的递归和迭代两种实现,最后也讲讲层序遍历。
一、前序遍历(Preorder Traversal)
✅ 顺序:
根 → 左 → 右
✅ 递归代码:
void preoerder(treeNode* root) { if (!root) { return; } cout << root->val << " "; //根 leetcode一般存到一个数组里 preoerder(root->left); //左 preoerder(root->right); //右}#### ✅ 迭代实现:
```cppvoid preorder(TreeNode* root) { if (!root) return; stack<TreeNode*> st; st.push(root); while (!st.empty()) { TreeNode* node = st.top(); st.pop(); cout << node->val << " "; if (node->right) st.push(node->right); // 注意:先右 if (node->left) st.push(node->left); }}### 二、中序遍历(Inorder Traversal)
#### ✅ 顺序:
#### 左 → 根 → 右
#### ✅ 递归代码:
```cppvoid inorder(TreeNode* root) { if (!root) return; inorder(root->left); // 遍历左子树 cout << root->val << " "; // 访问根 inorder(root->right); // 遍历右子树}#### ✅ 迭代实现:
```cppclass Solution {public: vector<int> inorderTraversal(TreeNode* root) { vector<int> result; stack<TreeNode*> st; TreeNode* cur = root; while (cur != NULL || !st.empty()) { if (cur != NULL) { // 指针来访问节点,访问到最底层 st.push(cur); // 将访问的节点放进栈 cur = cur->left; // 左 } else { cur = st.top(); // 从栈里弹出的数据,就是要处理的数据(放进result数组里的数据) st.pop(); result.push_back(cur->val); // 中 cur = cur->right; // 右 } } return result; }};### 三、后序遍历(Postorder Traversal)
#### ✅ 顺序:
#### 左 → 右 → 根
#### ✅ 递归代码:
```cppvoid postorder(TreeNode* root) { if (!root) return; postorder(root->left); // 遍历左子树 postorder(root->right); // 遍历右子树 cout << root->val << " "; // 访问根}#### ✅ 迭代技巧实现:
**方法:“根->右->左”后反转**
```cppvoid postorder(TreeNode* root) { if (!root) return; stack<TreeNode*> st; vector<int> result; st.push(root); while (!st.empty()) { TreeNode* node = st.top(); st.pop(); result.push_back(node->val); // 根 if (node->left) st.push(node->left); // 左 if (node->right) st.push(node->right); // 右 } reverse(result.begin(), result.end()); for (int v : result) cout << v << " ";}### 四、层序遍历(Level-order Traversal)
**✅ 顺序:**
#### 按层访问,每层从左到右
**✅ 使用队列(queue)**
```cppvector<vector<int>> levelOrder(TreeNode* root) { queue<TreeNode*> que; if (root != NULL) que.push(root); vector<vector<int>> result; while (!que.empty()) { int size = que.size(); vector<int> vec; for (int i = 0; i < size; i++) { TreeNode* node = que.front(); que.pop(); vec.push_back(node->val); if (node->left) que.push(node->left); if (node->right) que.push(node->right); } result.push_back(vec); } return result;}原文发布于 CSDN:二叉树的遍历