二叉树的前序遍历

news2024/12/22 19:00:39

题目

144. 二叉树的前序遍历 - 力扣(LeetCode)

本章我们来探讨运用二叉树中所学的知识解决本题。对二叉树仍有疑问的小伙伴可以点击下方链接哦。

参考文献:(1条消息) 二叉树(三)_染柒_GRQ的博客-CSDN博客

原理

首先我们来回顾一下解题原理:遍历顺序为 根,左子树和右右子树。

解题

审题

由于力扣是接口型O(J)题,所以我们先来看一下接口的含义。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

显然从这行代码可以看出,这是一个如图所示的链式结构。

链式结构

解题

根据经验我们应该先写扩容,原因很简单,由于这是链式结构,所以一定要开辟空间。

int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    int* a = (int*)malloc(sz * sizeof(int));
   
    return a;    
}

我们根据二叉树的实现可以再写一个计数函数。

int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0: TreeSize(root->left) + TreeSize(root->right) + 1;
}
int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    int sz = TreeSize(root);
    //开辟空间
    int* a = (int*)malloc(sz * sizeof(int));
   
    return a;    
}

最后一步就是开始遍历。

原理:遍历顺序为 根,左子树和右右子树。

int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0: TreeSize(root->left) + TreeSize(root->right) + 1;
}

void _preOrder(struct TreeNode* root, int* a, int* pi)
{
    if(root == NULL)
    {
        return;
    }
   a[*pi] = root->val;
   ++(*pi);
   _preOrder(root->left, a, pi);
   _preOrder(root->right, a, pi);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize){
    int sz = TreeSize(root);
    //开辟数组
    int* a = (int*)malloc(sz * sizeof(int));
    int* i = 0;
    _preOrder(root, a, &i);

    *returnSize = sz;

    return a;    
}

记住传值与传址的区别。

方法二

当然根据我们在二叉树中的套路,我们可以把 i 定义为全局变量,但是要注意细节,我在这里也绕了点弯。

int i =0;
int TreeSize(struct TreeNode* root)
{
   return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}

void _preOrder(struct TreeNode* root, int* a)
{
    if(root == NULL)
    {
        return;
    }
   a[i] = root->val;
   ++(i);
   _preOrder(root->left, a);
   _preOrder(root->right, a);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize)
{
    i = 0;
    int size = 0;
    int sz = TreeSize(root);
    //开辟空间
    int* a = (int*)malloc(sz * sizeof(int));
    _preOrder(root, a);

    *returnSize = sz;

    return a;    
}

总结

本题其实在我们对二叉树有了一定了解以后做出来其实并不难,写不出来无非就是对代码的不熟练导致的,望小伙伴们勤加练习,更进一步!

欢迎大家点赞和评论!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CyberBattleSim-(内网自动化渗透)研究分析

**01 **背景知识介绍 CyberBattleSim介绍 CyberBattleSim是一款微软365 Defender团队开源的人工智能攻防对抗模拟工具,来源于微软的一个实验性研究项目。该项目专注于对网络攻击入侵后横向移动阶段进行威胁建模,用于研究在模拟抽象企业网络环境中运行的…

基于蜣螂算法优化的核极限学习机(KELM)分类算法-附代码

基于蜣螂算法优化的核极限学习机(KELM)分类算法 文章目录基于蜣螂算法优化的核极限学习机(KELM)分类算法1.KELM理论基础2.分类问题3.基于蜣螂算法优化的KELM4.测试结果5.Matlab代码摘要:本文利用蜣螂算法对核极限学习机(KELM)进行优化,并用于分类1.KELM理…

R语言贝叶斯方法在生态环境领域中的应用

贝叶斯统计已经被广泛应用到物理学、生态学、心理学、计算机、哲学等各个学术领域,其火爆程度已经跨越了学术圈,如促使其自成统计江湖一派的贝叶斯定理在热播美剧《The Big Bang Theory》中都要秀一把。贝叶斯统计学即贝叶斯学派是一门基本思想与传统基于…

STM32CubeMx使用FreeRTOS搭建printf输出串口打印-----基于正点原子开发板阿波罗

文章目录STM32CubeMx使用FreeRTOS搭建printf输出串口打印-----基于正点原子开发板阿波罗1.输入目标芯片2.选择RCC时钟3.配置调试模式4.USART的配置5.配置中断6.printf的重定向功能7.代码添加8.修改中断函数9.添加全局变量10.增加FreeRTOS支持11.在FreeRTOS中添加源码STM32CubeM…

【数学建模】数学建模中的常用工具推荐

前言 整理了几款我在建模比赛中需要准备的小工具,后续会随时不定期更新,以及完善内容,需要的小伙伴建议收藏一波~ [1] 公式编译器 Axmath(建议购买正版)mathtypeWord内置的公式编辑器 Axmath是国产的软件&#xff0…

pytorch安装(模式识别与图像处理课程实验)

pytorch安装(模式识别与图像处理课程实验)1、 打开cmd,创建torch虚拟环境。2、 激活创建的torch虚拟环境2.1、 进入pytorch官网,复制如下的命令,进行pytorch的安装2.2、测试安装是否成功3、 通过pip命令安装pytorch&am…

基于WPS实现Excel表的二级下拉选择框

基于WPS实现Excel表的二级下拉选择框第一步:先在sheet2上创建源数据第二步:创建一级下拉框第三步:创建二级下拉框报错记录: “列表源”XXXXXX第一步:先在sheet2上创建源数据 第二步:创建一级下拉框 一级下…

难受啊,备战字节跳动132天,因为一个疏忽让我前功尽弃...

📌 博客主页: 程序员二黑 📌 专注于软件测试领域相关技术实践和思考,持续分享自动化软件测试开发干货知识! 📌 如果你也想学习软件测试,文末卡片有我的交流群,加入我们,一…

Kibana报错:Kibana server is not ready yet

背景 网页中访问kinaba http://localhost:5601 ,一直提示“Kibana server is not ready yet”。 执行如下命令查看kibana日志, docker logs kibana 发现有提示: 正文 怀疑是不是容器重启后,各容器内部ip变化了导致。 1、故执行如下命令查看…

Android框架源码分析——从设计模式角度看 RxJava 核心源码

从设计模式角度来看 RxJava 核心源码 从订阅者模式和装饰器模式的角度来看 RxJava 源码。 1. 普通订阅者模式与 RxJava 中的订阅者模式 订阅者模式又叫做观察者模式,主要用于实现响应式编程。其本质,就是接口回调。 普通订阅者模式:多个对…

来啦,华东师范大学2024年入学MBA提前面试流程及时间

项目简介华东师范大学系国家教育部和国务院学位办【2007(36)号】批准的工商管理硕士(MBA)培养单位。华东师范大学MBA项目,依托学校深厚的人文底蕴和育人文化,利用多学科支撑的优势、利用多元化的办学资源&a…

CUAD学习笔记

目录一、头文件**1、mex.h****2、matrix.h****3、string****4、iostream****5、omp.h**6、cuda_runtime.h7、stdlib.h8、sys/time.h9、stdio.h10、string.h11、time.h12、math.h13、device_launch_parameters.h二、一些声明语句1、using namespace std**2、typedef unsigned ch…

pytorch数据读取深入理解

来源:投稿 作者:小灰灰 编辑:学姐 了解数据 Q:我现在什么基础也没有,我要学习深度学习,学习cv,学习nlp。 A:首先我们知道,深度学习是建立在数据集的基础上。现在呢&…

【C++】C++11 ~ 右值引用和移动语义

🌈欢迎来到C专栏~~右值引用和移动语义 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一…

mongodb 使用密钥文件身份验证部署副本集

一 副本集介绍 集群中每个节点有心跳检测 如果由于资源限制,可以部署一主一从一仲裁 副本集集群可以实现主从的自动切换 Read Preference 在客户端连接中,可以实现读取优先,就是连接器会自动判断,把读取请求发送到副本集中的…

whois命令常见用法

whois命令常见用法whois命令简介安装whoisWindows使用whoisLinux安装whoiswhois常见用法Linux下whois查询域名注册信息whois命令简介 whois就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商)。…

分析第一个安卓项目

整体分析 .gradle和.idea 这两个目录下放置的都是Android Studio自动生成的一些文件,我们无须关心,也不要去手动编辑。 app 项目中的代码、资源等内容几乎都是放置在这个目录下的。 gradle 这个目录下包含了gradle wrapper的配置文件,使…

flowable流程设计器的几个bug修改记录

今天根据客户反馈开源项目宁波阿成 (nbacheng) - Gitee.com 有一些bug,主要是前端的,所以今天修正一下 1、对于第一个节点是发起人,后面是多人选择的时候,approval数据被清空了 就是上面的流程,发现有问题 对这种情…

实例13:体育竞技分析

高手过招,胜负只在毫厘之间 计算思维:抽象自动化 模拟:抽象比赛过程自动化执行N场比赛 当N越大时,比赛结果分析会越科学 自顶向下:解决复杂问题的有效方法,将总问题拆分为小问题,分而治之自底向…

【微服务】分布式搜索引擎elasticsearch(3)

分布式搜索引擎elasticsearch(3)1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.2.1.Bucket聚合语法1.2.2.聚合结果排序1.2.3.限定聚合范围1.2.4.Metric聚合语法1.2.5.小结1.3.RestAPI实现聚合1.3.1.API语法1.3.2.业务需求1.3.3.业务实现2.自动补全2.1.拼音分…