【C++】二叉树的遍历:前序、中序、后序、层序
原创
©著作权归作者所有:来自51CTO博客作者zdb呀的原创作品,请联系作者获取转载授权,否则将追究法律责任
二叉树的遍历
144. 二叉树的前序遍历
94. 二叉树的中序遍历
145. 二叉树的后序遍历
二叉树的递归遍历
递归三要素:
- 确定递归函数的参数和返回值:
void preorder(TreeNode *root, vector<int>& res)
- 确定终止条件:
if(cur == nullptr) return;
- 确定单层递归的逻辑
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
void preorder(TreeNode *root, vector<int> &res) {
if (root == nullptr) return;
res.push_back(root->val); //中
preorder(root->left, res); //左
preorder(root->right, res); //右
}
vector<int> preorderTraversal(TreeNode *root) {
vector<int> res;
preorder(root, res);
return res;
}
};
实现不同的遍历顺序通过修改单层递归的逻辑实现
二叉树的迭代遍历
通过栈实现
时间复杂度:O(n)
空间复杂度:O(n)
前序遍历
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVx6v33G-1641297837503)(https://gitee.com/zdbya/picgo_image/raw/master/SSL_img/e50ae29f686c4223b82f85816f00ef87.gif)]
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
if(root == nullptr) return res;
s.push(root); //压入根结点
while (!s.empty()){ //入栈是 根右左
TreeNode* node = s.top();
s.pop();
res.push_back(node->val); //中
if (node->right) stk.push(node->right); //右
if (node->left) stk.push(node->left); //左
}
return res;
}
};
中序遍历
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
TreeNode* cur = root;
while (cur != NULL || !st.empty()) {
if (cur != NULL) { // 指针来访问节点,访问到最底层
s.push(cur); // 将访问的节点放进栈
cur = cur->left; // 左
}
else {
cur = s.top(); // 从栈里弹出的数据,就是要处理的数据(放进result数组里的数据)
s.pop();
res.push_back(cur->val); // 中
cur = cur->right; // 右
}
}
return res;
}
};
后序遍历
class Solution {
public:
//后续迭代最难,有些结点反复进出栈
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
if (root == nullptr) return res;
s.push(root);
while(!s.empty()){
auto node = s.top();
s.pop();
res.push_back(node->val); //中
if(node->left) s.push(node->left); //左
if(node->right) s.push(node->right); //右
}
reverse(res.begin(), res.end()); // 将结果反转之后就是左右中的顺序了
return res;
}
};
二叉树的层序遍历
102. 二叉树的层序遍历
通过队列实现
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> res;
if (!root) return res; //排除空二叉树情况
queue <TreeNode*> q;
q.push(root); //根结点入队
while (!q.empty()) {
int currentLevelSize = q.size(); //记录当前层的结点个数
res.push_back(vector <int>());
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); //获取队头元素
q.pop(); //删除队头元素
res.back().push_back(node->val); //往ret的最后一个容器中压元素
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return res;
}
};