day14 二叉树的遍历 递归遍历 迭代遍历 统一遍历

题目1:递归遍历

题目链接1:144 二叉树的前序遍历

题意

根据二叉树的根节点root,返回它的前序遍历

递归法

前序遍历:中左右

递归三部曲

1) 确定递归函数的参数和返回值

2)确定终止条件

3)确定单层递归逻辑

伪代码

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur,vector<int>& result){
        //终止条件
        if(cur==NULL){
            return;
        }
        //单层递归逻辑
        //前序:中左右
        result.push_back(cur->val);//中
        traversal(cur->left,result);//左
        traversal(cur->right,result);//右
    }
    vector<int> preorderTraversal(TreeNode* root) {
       vector<int> result;
       traversal(root,result);
       return result;
    }
};

迭代法

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        st.push(root);
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            if(node!=NULL){
                result.push_back(node->val);
            }
            else{
                continue;
            }
            if(node->right){
                st.push(node->right);
            }
            if(node->left){
                st.push(node->left);
            }
        }
        return result;
    }
};

题目2:145 二叉树的后序遍历

题目链接2:145 二叉树的后序遍历

题意

根据二叉树的根节点root,返回它的后序遍历

递归法

后序遍历:左右中

递归三部曲:

1) 确定递归函数的参数和返回值

2)确定终止条件

3)确定单层递归逻辑

伪代码

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur,vector<int>& result){
        //终止条件
        if(cur==NULL){
            return;
        }
        //单层递归逻辑
        traversal(cur->left,result);//左
        traversal(cur->right,result);//右
        result.push_back(cur->val);//中
    }
    vector<int> postorderTraversal(TreeNode* root){
        vector<int> result;
        traversal(root,result);
        return result;

    }
};

迭代法

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root){
        vector<int> result;
        stack<TreeNode*> st;
        st.push(root);
        //终止条件
        while(!st.empty()){
            TreeNode* node = st.top();
            st.pop();
            if(node!=NULL){
                result.push_back(node->val);
            }
            else{
                continue;
            }
            if(node->left){
                st.push(node->left);
            }
            if(node->right){
                st.push(node->right);
            }
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

题目3:94 二叉树的中序遍历

题目链接3:94 二叉树的中序遍历

题意

根据二叉树的根节点root,返回它的后序遍历

递归法

中序遍历:左中右

递归三部曲:

1) 确定递归函数的参数和返回值

2)确定终止条件

3)确定单层递归逻辑

伪代码

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur,vector<int>& result){
        //终止条件
        if(cur==NULL){
            return;
        }
        //中序遍历,左中右
        traversal(cur->left,result);//左
        result.push_back(cur->val);//中
        traversal(cur->right,result);//右
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root,result);
        return result;
    }
};

迭代法

如果按照前序遍历和后序遍历的迭代法来,那么访问的元素和要处理的元素顺序不一致

所以,需要一个指针cur指针遍历节点,栈处理遍历过的节点

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while(!st.empty() || cur!=NULL){
            //向左一直遍历
            if(cur!=NULL){
                st.push(cur);
                cur = cur->left;//左
            }
            //向左遍历遇到空节点
            else{
                //加入当前节点,相当于中节点,并更新当前指针
                cur = st.top();
                st.pop();
                result.push_back(cur->val);//中
                //遍历当前节点的右孩子
                cur = cur->right;//也是一颗二叉树,继续同样的操作(一直向左,当前节点,右孩子)
            }
        }
        return result;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/309320.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux搭建SRS服务器

linux搭建SRS服务器 文章目录 linux搭建SRS服务器SRS说明实验说明搭建步骤推流步骤查看web端服务器拉流步骤final SRS说明 SRS&#xff08;simple Rtmp Server&#xff09;,是一个简单高效的实时视频服务器&#xff0c;支持RTMP/WebRTC/HLS/HTTP-FLV/SRT, 是国人自己开发的一款…

计算机基础面试题 |22.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

坑记(HttpInputMessage)

一、背景知识 public interface HttpInputMessage extends HttpMessage Represents an HTTP input message, consisting of headers and a readable body.Typically implemented by an HTTP request on the server-side, or a response on the client-side.Since: 3.0 Author:…

windows安装Elasticsearch后使用ik分词器报错解决办法

最近在学习Elasticsearch&#xff0c;安装完成后下载了ik分词器压缩到plugins目录下启动es报错如下&#xff1a; java.security.AccessControlException: access denied (“java.io.FilePermission” “D:…\plugins\ik-analyzer\config\IKAnalyzer.cfg.xml” “read”)咋一看…

03 - 系统调用

---- 整理自 王利涛老师 课程 实验环境&#xff1a;宅学部落 www.zhaixue.cc 文章目录 1. 系统调用基本概念1.1 一个系统调用的例子1.2 什么是系统调用&#xff1f;软件复用的角度 2. 软中断&#xff1a;系统调用的入口2.1 权限管理2.2 系统调用号2.4 man 2 syscall2.5 实验&am…

全自动网页生成系统网站源码重构版

源码优点: 所有模板经过精心审核与修改&#xff0c;完美兼容小屏手机大屏手机&#xff0c;以及各种平板端、电脑端和360浏览器、谷歌浏览器、火狐浏览器等等各大浏览器显示。 免费制作 为用户使用方便考虑&#xff0c;全自动网页制作系统无需繁琐的注册与登入&#xff0c;直…

MongoDB 设置账号密码_mongodb设置用户名和密码

MongoDB 设置账号密码_mongodb设置用户名和密码 1、安装 安装可以看我这篇文章:https://blog.csdn.net/u014641168/article/details/123937775 2、说明 由于默认安装的MongoDB是没有设置用户密码的,极其危险,所以需要设置一下用户密码 3、创建用户 用Navicat15连接Mon…

Web组件的使用

文章目录 1 概述2 加载网页加载在线网页加载本地网页 3 网页缩放文本缩放 4 Web组件事件Web组件处理JS confirm事件 5 Web和JavaScript交互启用JavaScriptWeb组件调用JS方法JS调用Web组件方法 6 处理页面导航7 调试网络应用8 参考链接 1 概述 相信大家都遇到过这样的场景&…

Serverless 开拓无服务器时代:云计算的新趋势(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

SouthernBiotech抗荧光淬灭封片剂

荧光淬灭又称荧光熄灭或萃灭&#xff0c;是指导致特定物质的荧光强度和寿命减少的所有现象。引起荧光淬灭的物质称为荧光淬灭剂。SouthernBiotech专门开发的Fluoromount-G系列荧光封片剂是以甘油为基础&#xff0c;加入抗荧光淬灭剂&#xff0c;可明显降低荧光淬灭现象&#xf…

提升测试多样性,揭秘Pytest插件pytest-randomly

大家可能知道在Pytest测试生态中&#xff0c;插件扮演着不可或缺的角色&#xff0c;为开发者提供了丰富的功能和工具。其中&#xff0c;pytest-randomly 插件以其能够引入随机性的特性而备受欢迎。本文将深入探讨 pytest-randomly 插件的应用&#xff0c;以及如何通过引入随机性…

MySQL:索引失效场景总结

1 执行计划查索引 通过执行计划命令可以查看查询语句使用了什么索引。 EXPLAIN SELECT * FROM ods_finebi_area WHERE areaName = 福建 执行查询计划后,key列的值就是被使用的索引的名称,若key列没有值表示查询未使用索引。 2 在什么列上创建索引 (1)列经常被用于where…

Ubuntu 22.0.4 忘记重置 MySQL 密码

Ubuntu 22.0.4 忘记重置 MySQL 密码 一、问题描述二、解决办法 一、问题描述 Ubuntu 22.0.4 忘记了 MySQL的密码&#xff0c;需要重新设置密码 环境描述&#xff1a; 系统&#xff1a;Ubuntu 22.0.4 MySQL&#xff1a;8.0.35 &#xff08;通过 apt install mysql-sever 安装的…

HarmonyOS 容器组件(Column Row Flex)

今天 我们来说容器组件中的 Column Row Flex Column 我们应该比较熟了 之前用了很多了 是一个列容器 老规矩 先来一个组件骨架 Entry Component struct Index {build() {Column({space: 30}) {}.width(100%).height(100%)} }我们在中的 Column 元素中加入代码 Column() {Co…

python统计分析——箱线图(df.boxplot)

资料来源&#xff1a;用python学统计学&#xff0c;帮助文档 使用pd.dataframe.boxplot()函数绘制箱线图 import numpy as np import pandas as pd from matplotlib import pyplot as pltdfpd.DataFrame({type:[A,A,A,A,A,A,A,A,A,A,B,B,B,B,B,B,B,B,B,B],value:[2,3,3,4,4,4…

JDBC多表联查

JDBC多表联查 在单一表进行查询时&#xff0c;只需要对表中的单个字段进行解析即可&#xff1b;例如下面代码&#xff1a; Overridepublic List<ClassBean> selectAllDao() {List list new ArrayList();try {String sql "select * from class";rs select(s…

buuctf[极客大挑战 2019]BabySQL--联合注入、双写过滤

目录 1、测试万能密码&#xff1a; 2、判断字段个数 3、尝试联合注入 4、尝试双写过滤 5、继续尝试列数 6、查询数据库和版本信息 7、查询表名 8、没有找到和ctf相关的内容&#xff0c;查找其他的数据库 9、查看ctf数据库中的表 10、查询Flag表中的字段名 11、查询表…

移远通信推出两款Wi-Fi 7模组新品,赋能无线连接巅峰体验

​1月9日&#xff0c;在2024年国际消费电子产品展览会 (CES) 期间&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出支持Wi-Fi 7技术的通信模组FGE576Q和FGE573Q &#xff0c;这两款模组将以前沿的Wi-Fi性能突破无线连接边界&#xff0c;为下一…

RabbitMQ(六)消息的持久化

目录 一、简介1.1 定义1.2 消息丢失的场景 二、交换机的持久化方式一&#xff1a;直接 new方式二&#xff1a;channel.exchangeDeclare()方式三&#xff1a;ExchangeBuilder【推荐】 三、队列的持久化方式一&#xff1a;直接 new方式二&#xff1a;channel.queueDeclare()方式三…

牛客网-JAVA(错题集)-1

1 Java的抽象类和接口不可以进行实例化 2 知识点&#xff1a; 1、不论如何 finally里面的代码是一定会执行的 2、finally里面的代码块比return早执行 3、多个return是按顺序执行的&#xff0c;只执行一次 public abstract class Test {public static void main(String[] ar…