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



目录
相关文章
|
2月前
|
C++
基本二叉树与排序二叉树(C++源码)
本程序实现二叉树基本操作与二叉排序树应用。支持前序建树、四种遍历、求深度、叶子数、第K层节点数及查找功能;并实现二叉排序树的构建、中序输出与查找比较次数统计,分析不同插入顺序对树形态和查找效率的影响。
|
11月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
371 12
|
11月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
200 10
|
11月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
551 3
|
11月前
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
680 0
|
存储 C++
【C++】二叉树进阶之二叉搜索树(下)
【C++】二叉树进阶之二叉搜索树(下)
108 4
|
Java 编译器 C++
【C++】二叉树进阶之二叉搜索树(上)
【C++】二叉树进阶之二叉搜索树(上)
108 3
|
算法 C++
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
|
存储 算法 搜索推荐
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
172 0