代码随想录算法训练营第13天 | 二叉树的递归遍历、102.二叉树的层序遍历
文章目录
144.二叉树的前序遍历
解题思路
递归三要素:
- 确定递归函数的参数和返回值
本题要打印前序遍历节点的数值,参数中传入 vector 容器来存放节点数值
- 确定终止条件
当前遍历节点为空时,结束递归
- 确定单层递归的逻辑
前序遍历顺序为中左右,对于后面的后序遍历和中序遍历,只要记住各个遍历顺序即可
代码实现
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == nullptr) {
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;
}
};
题目总结
二叉树的三种遍历也可以用迭代法来实现,但相对于递归而言,迭代对于前序遍历和中序遍历,在前序遍历时访问节点(遍历节点)和处理节点(将元素放进result数组中)可以做到同步处理,但是中序就无法做到同步,这就没有递归法方便,也没有做到代码统一。
145.二叉树的后序遍历
代码实现
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == nullptr) {
return;
}
traversal(cur->left, vec);
traversal(cur->right, vec);
vec.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
94.二叉树的中序遍历
代码实现
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec) {
if (cur == nullptr) {
return;
}
traversal(cur->left, vec);
vec.push_back(cur->val);
traversal(cur->right, vec);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
102.二叉树的层序遍历
解题思路
通过队列来实现,队列先进先出,符合一层一层遍历的逻辑,模拟一层一层实现的过程。
代码实现
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> que;
if (root != nullptr)
que.push(root);
vector<vector<int>> result;
while (!que.empty()) {
int size = que.size();
vector<int> vec;
while (size--) {
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;
}
};
题目总结
层序用队列可以比较好的模拟出一层一层的效果。