二叉树的遍历

前言: 什么是二叉树遍历? 遍历就是“按照一定的顺序访问树中的每一个节点”,常见顺序包括: 前序遍历( 根 → 左 → 右 ) 中序遍历( 左 → 根 → 右 ) 后序遍历( 左 → 右 → 根 ) 层序遍历( 一层一层访问,从上到下,从左到右 ) 我们重点讲解 前、中、后序 的

作者 TommyWu
封面圖片: 二叉树的遍历

#前言:

什么是二叉树遍历?

遍历就是 “按照一定的顺序访问树中的每一个节点”,常见顺序包括:

  • 前序遍历(根 → 左 → 右
  • 中序遍历(左 → 根 → 右
  • 后序遍历(左 → 右 → 根
  • 层序遍历(一层一层访问,从上到下,从左到右

我们重点讲解前、中、后序递归和迭代两种实现,最后也讲讲层序遍历。

 

#一、前序遍历(Preorder Traversal)

#✅ 顺序:

#根 → 左 → 右

#✅ 递归代码:

void preoerder(treeNode* root) {
if (!root) {
return;
}
cout << root->val << " "; //根 leetcode一般存到一个数组里
preoerder(root->left); //左
preoerder(root->right); //右
}
#### ✅ 迭代实现:
```cpp
void 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)
#### ✅ 顺序:
#### 左 → 根 → 右
#### ✅ 递归代码:
```cpp
void inorder(TreeNode* root) {
if (!root) return;
inorder(root->left); // 遍历左子树
cout << root->val << " "; // 访问根
inorder(root->right); // 遍历右子树
}
#### ✅ 迭代实现:
```cpp
class 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)
#### ✅ 顺序:
#### 左 → 右 → 根
#### ✅ 递归代码:
```cpp
void postorder(TreeNode* root) {
if (!root) return;
postorder(root->left); // 遍历左子树
postorder(root->right); // 遍历右子树
cout << root->val << " "; // 访问根
}
#### ✅ 迭代技巧实现:
**方法:“根->->左”后反转**
```cpp
void 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)**
```cpp
vector<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:二叉树的遍历