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;
    }
};
相关推荐
DeniuHe10 分钟前
逻辑回归(Logistic Regression)详细解释与公式推导
算法·机器学习·逻辑回归
迅量科技资讯分享14 分钟前
手机拍照明晰度评估:传感器尺寸像素数量与处理器算法解析
算法·三星·像素
liu****16 分钟前
12.线程同步与互斥
linux·数据结构·c++·算法·1024程序员节
麦烤楽鸡翅30 分钟前
小红书推荐系统(牛客)
java·python·算法·秋招·春招·牛客·面试算法题
王哈哈^_^40 分钟前
CV三大核心任务:目标检测、图像分割、关键点检测
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测
wefg11 小时前
【数据结构】红黑树
数据结构·算法
饼瑶1 小时前
基于AutoDL远端服务复现具身智能论文OpenVLA
算法
Mr.Winter`1 小时前
无人船 | 图解基于MPC控制的路径跟踪算法(以全驱动无人艇WAMV为例)
人工智能·算法·机器人·自动驾驶·ros·路径规划
咪咪渝粮1 小时前
112.路径总和
java·数据结构·算法
高洁012 小时前
大模型-详解 Vision Transformer (ViT) (2
深度学习·算法·aigc·transformer·知识图谱