Day12 二叉树遍历

深度优先遍历

给你二叉树的根节点 root ,返回它节点值的 前序 /中序 /后序 遍历。

递归

二叉树的遍历默认是先左后右

cpp 复制代码
    //二叉树遍历函数
    void traverse(TreeNode* root){//从某一节点开始
        if(root==nullptr) return;
        traverse(root->left);//访问该节点的左子节点
        traverse(root->right);//访问该节点的右子节点
    }

不管前序、中序还是后序,二叉树的遍历顺序是一致的,该顺序和前序遍历一致。不同序的区别其实在于何时记录一个节点。

任何节点均会被访问三次

  1. 初次访问该节点,还未访问它的左子节点。
  2. 完成左子节点的访问,回到该节点,即将访问右子节点。
  3. 完成右子节点的访问,回到该节点,并继续向上返回

在以上三个时刻对该节点的值进行返回,就分别对应前序 /中序 /后序

cpp 复制代码
    vector<int> ans;
    void traverse(TreeNode* root){
        if(root==nullptr) return;
        //前序处理时机
        traverse(root->left);
        //中序处理时机
        traverse(root->right);
        //后序处理时机
    }

本题的处理为ans.push_back(root->val);

迭代

用栈实现

前序

每次while循环都会弹出一个node,然后让node->right入栈,再让node->left入栈,此时node->left在栈顶。下一次循环会弹出node->left,如果为nullptr,不会有元素入栈,下一次循环会弹出node->right,也就是中左右的遍历顺序。

cpp 复制代码
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans;
        stack<TreeNode*> st;
        st.push(root);
        TreeNode* top;
        while(!st.empty()){
            top = st.top();
            st.pop();
            if(top){
                if(top->right) st.push(top->right);//右结点先入栈,后出栈
                if(top->left) st.push(top->left);
                ans.push_back(top->val);
            }
        }
        return ans;
    }
};

后序

cpp 复制代码
//待写入

中序

cpp 复制代码
//待写入

统一写法

cpp 复制代码
//待写入

广度优先遍历

即层序遍历

102. 二叉树的层序遍历 - 力扣(LeetCode)

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

  • size记录队列中节点个数,决定本层要弹出几次
  • 每弹出一个节点,都要把左右子节点加入队列(如果存在的话)
  • 当所有节点都被弹出,队列中只剩下被弹出的所有节点的子节点,也就是完整的下一层元素

size可以区分队列内哪些节点属于同一层

cpp 复制代码
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        queue<TreeNode*> q;
        if(root == nullptr) return result;
        q.push(root);
        int size ;
        TreeNode* temp;
        while(!q.empty()){
            size = q.size();
            vector<int> ans;
            for(int i = 0;i<size;i++){
                temp = q.front();
                q.pop();
                ans.push_back(temp->val);
                if(temp->left) q.push(temp->left);
                if(temp->right) q.push(temp->right);
            }
            result.push_back(ans);
        }
        return result;
    }
};
相关推荐
颜酱31 分钟前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
Gorway7 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风7 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect7 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea21 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect1 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP2 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉