代码随想录算法训练营第14天 | 二叉树 | 二叉树的遍历 | 迭代遍历 |统一风格的迭代(待补充)
理论基础
- 二叉树的存储方式:可以链式也可以顺序
- 用数组顺序存储
![]()
- 用数组顺序存储
- 二叉树的遍历
![]()
递归遍历
递归算法三要素
- 确定递归函数的参数和返回值
- 确定终止条件
- 确定单层递归的逻辑
风格不统一的迭代遍历(前后和中序的不同)
- 前序遍历(根左右)
![]()
//递归版
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
vec.push_back(cur->val); // 中
traversal(cur->left, vec); // 左
traversal(cur->right, vec); // 右
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
尾递归转迭代
//迭代版
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if (root == NULL) return result;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top(); // 中
st.pop();
result.push_back(node->val);
if (node->right) st.push(node->right); // 右(空节点不入栈),右孩子先入栈,后弹出
if (node->left) st.push(node->left); // 左(空节点不入栈)
}
return result;
}
- 中序遍历(左根右)
![]()
//递归版
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == NULL) return;
traversal(cur->left, vec); // 左
vec.push_back(cur->val); // 中
traversal(cur->right, vec); // 右
}
//迭代版
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;
}
- 后序遍历(左右根)
![]()
统一风格的迭代
迭代法实现的先中后序,其实风格不是那么统一,除了先序和后序有关联,中序完全就是另一个风格了,一会用栈遍历,一会又用指针来遍历





浙公网安备 33010602011771号