栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

二叉树的遍历

144. 二叉树的前序遍历

94. 二叉树的中序遍历

145. 二叉树的后序遍历

二叉树的递归遍历

递归三要素:

  1. 确定递归函数的参数和返回值:void preorder(TreeNode *root, vector& res)
  2. 确定终止条件:if(cur == nullptr) return;
  3. 确定单层递归的逻辑

时间复杂度:O(n)
空间复杂度:O(n)

class Solution {
public:
    void preorder(TreeNode *root, vector &res) {
        if (root == nullptr) return;
        
        res.push_back(root->val);    //中
        preorder(root->left, res);   //左
        preorder(root->right, res);  //右
    }

    vector preorderTraversal(TreeNode *root) {
        vector 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 preorderTraversal(TreeNode* root) {
        vector res;
        stack 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 inorderTraversal(TreeNode* root) {
        vector res;
        stack 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 postorderTraversal(TreeNode* root) {
        vector res;
        stack 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> levelOrder(TreeNode* root) {
        vector > res;
        if (!root)  return res;    //排除空二叉树情况

        queue  q;
        q.push(root);    //根结点入队

        while (!q.empty()) {
            int currentLevelSize = q.size();   //记录当前层的结点个数
            res.push_back(vector ());

            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;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/696829.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号