【C++】二叉树的遍历:前序、中序、后序、层序

简介: 【C++】二叉树的遍历:前序、中序、后序、层序

二叉树的遍历


144. 二叉树的前序遍历


94. 二叉树的中序遍历


145. 二叉树的后序遍历


二叉树的递归遍历


递归三要素:


  1. 确定递归函数的参数和返回值:void preorder(TreeNode *root, vector<int>& res)


  1. 确定终止条件:if(cur == nullptr) return;


  1. 确定单层递归的逻辑


时间复杂度: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)


前序遍历


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;
    }
};



相关文章
|
24天前
|
C++
二叉树进阶面试题(精华总结)【C++版本】
二叉树进阶面试题(精华总结)【C++版本】
|
24天前
|
存储 编译器 数据库
【C/C++ 数据结构 】线索二叉树全解析:从数学原理到C++实现
【C/C++ 数据结构 】线索二叉树全解析:从数学原理到C++实现
61 0
|
24天前
|
算法 C++ 开发者
【C/C++ 数据结构 】二叉树基本性质:对于任何一颗二叉树T,若其终端结点为n0 ,那么度数为2的结点数为n2。则n0=n2+1...
【C/C++ 数据结构 】二叉树基本性质:对于任何一颗二叉树T,若其终端结点为n0 ,那么度数为2的结点数为n2。则n0=n2+1...
24 0
|
6天前
|
C++ 安全
高效遍历:C++中分隔字符串单词的3种方法详解与实例
拷贝并交换(Copy-and-Swap)是C++中实现赋值操作符和异常安全拷贝构造函数的技巧。它涉及创建临时对象,使用拷贝构造函数,然后交换数据以确保安全。C++11之前的策略在此后及C++11引入的移动语义和右值引用下仍有效,但后者提供了更高效的实现方式。
|
15天前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(1) 遍历算法
黑马c++ STL常用算法 笔记(1) 遍历算法
|
18天前
|
存储 C++
【C++】二叉树进阶 -- 详解
【C++】二叉树进阶 -- 详解
|
24天前
|
开发工具 对象存储 Android开发
对象存储oss使用问题之C++使用OSS SDK时遍历OSS上的文件时崩溃如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
|
24天前
|
存储 C++
二叉树的操作(C++实现)
二叉树的操作(C++实现)
|
24天前
|
存储 C++
【C++练级之路】【Lv.14】二叉搜索树(进化的二叉树——BST)
【C++练级之路】【Lv.14】二叉搜索树(进化的二叉树——BST)
【C++练级之路】【Lv.14】二叉搜索树(进化的二叉树——BST)
|
24天前
|
存储 算法 数据管理
C++中利用随机策略优化二叉树操作效率的实现方法
C++中利用随机策略优化二叉树操作效率的实现方法
78 1