二叉树OJ题:LeetCode--144.二叉树的前序遍历

news2024/11/22 18:19:43

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第144道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

数据结构与算法专栏:数据结构与算法

个  人  主  页 :stackY、

C 语 言 专 栏C语言:从入门到精通

 LeetCode--144.二叉树的前序遍历:https://leetcode.cn/problems/binary-tree-preorder-traversal/

目录

1.题目介绍

2.实例演示

3.解题思路

#二叉树结点个数 

#将二叉树结点的值保存在数组中 

完整代码:


1.题目介绍

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

2.实例演示

3.解题思路

本道题的意思要将前序遍历的结果储存在一个数组中,而这个数组需要动态开辟,那么这里就牵扯到数组开多大的空间?要想知道数组开多大的空间那么就需要知道二叉树有多少个结点,因此我们首先要求出二叉树的结点个数。

#二叉树结点个数 

关于如何求二叉树的结点的个数在这篇博文中有过介绍:二叉树的链式结构

求二叉树结点个数的主要思想:左右子树结点个数 + 1

代码演示:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */


//计算二叉树的结点个数
//节点个数 = 左右子树节点个数 + 1(根节点)
int BTreeSize(struct TreeNode* root)
{
    if(root == NULL)
    {
        return 0;
    }
    return BTreeSize(root->left) 
         + BTreeSize(root->right) + 1;
}

int* preorderTraversal(struct TreeNode* root, int* returnSize){
 
    *returnSize = BTreeSize(root);
    //创建数组
    //......
}

#将二叉树结点的值保存在数组中 

先对二叉树进行前序遍历:根节点、左子树、右子树,然后将根节点的值保存在数组中,再进行左右子树的递归,这里要注意的是:需要从外部传进来一个下标的指针,如果在函数内部设置下标,那么每一次函数递归调用就会创建新的下标,这样子只能保存第一个结点,如果从外部传的是地址,那么每一次函数递归调用就会去访问这块地址,这样就确保了不会重复保存。

完整代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */


//计算二叉树的结点个数
//节点个数 = 左右子树节点个数 + 1(根节点)
int BTreeSize(struct TreeNode* root)
{
    if(root == NULL)
    {
        return 0;
    }
    return BTreeSize(root->left) 
         + BTreeSize(root->right) + 1;
}

//前序遍历
//将前序遍历的结果保存在一个数组里面
void _preorderTraversal(struct TreeNode* root, int* pa, int* pi)
{
    //判断是否为空树
    if(root == NULL)
        return;
    //若不为空则将根节点保存至数组中
    pa[*pi] = root->val;
    (*pi)++;

    //继续递归遍历它的左右子树
    _preorderTraversal(root->left, pa, pi);
    _preorderTraversal(root->right, pa, pi);
}


int* preorderTraversal(struct TreeNode* root, int* returnSize){
    *returnSize = BTreeSize(root);
    //创建数组
    //根据二叉树的结点个数来创建数组的大小
    int* a = (int*)malloc(sizeof(int) * (*returnSize));
    //创建数组下标
    int i = 0;
    _preorderTraversal(root, a, &i);
    //返回前序遍历结果
    return a;
}

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持! 

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

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

相关文章

考完啦,回归!

暑假加训!!! 不能到时候被学弟比下去了!!! 冲冲冲!!!

SpringBoot整合人大金仓(kingbase8)

因客户要求使用人大金仓数据库,因此最近在java适配人大金仓数据库,在此做下笔记,此为第三步,SpringBoot整合人大金仓(kingbase8) 1.创建与模式对应用户,如我所用模式为hhh-system,则…

RS-FAIRFRS: COMMUNICATION EFFICIENT FAIR FEDERATED RECOMMENDER SYSTEM

RS-FAIRFRS: COMMUNICATION EFFICIENT FAIR FEDERATED RECOMMENDER SYSTEM Anonymous authors Paper under double-blind review communication efficient fair federated recommender system ICLR 2023 1. What does literature study? 结合随机抽样和确定每轮通信中要抽样…

vmware总结

1、CD/DVD设置 如果设备状态没有勾选已连接,那么当挂载镜像的时候,就会提示找不到设备。

有没有好用的ai图片处理器?这几款软件都能实现ai图片处理

朋友们,我今天要和你们聊一聊一个非常有趣的话题——ai图片网站!没错,你没听错,就是那种可以让你在瞬间找到想要的图片的神奇网站。想象一下,你需要一张火爆的表情包,或者一幅令人心旷神怡的风景图&#xf…

为什么高并发这么难?非停事故频频发生?一天宕机三次?【B站、唯品会也难幸免】我们该怎么做?

宕机事件 原因解析: 1、一方面故障是不可避免的,有人为的故障(是人就容易出错的)和非人为的故障(机器 Failure)。这些是无法避免的停机,还有有计划的停机,如发布新系统、升级维护、更…

PHP 的 Logo 为什么是大象?

因为大象是世界上最好的动物。 当然,这只是开玩笑,那么为什么PHP的LOGO是大象呢?还有哪些关于PHP的LOGO的有趣的事情呢? 吉祥物-大象 ElePHPant 是一款可爱的 PHP 吉祥物,其设计中有一头大象。 最初的LOGO 1998 年…

golang,OpenGL,计算机图形学(一)

开发环境与依赖 github.com/go-gl/gl/v4.1-core/gl github.com/go-gl/glfw/v3.2/glfw OpenGL只提供了绘图功能,创建窗口是需要自己完成的。这就需要学习相应操作系统的创建窗口方法,比较复杂,并且每个操作系统都不同。为简化创建窗口的过程…

JavaScript ,16种常用数组方法

前言 📗众所周知,向后端请求数据,处理数据是前端工程师必备的技能,从后端请求回来的数据往往是数组的形式返回到前端,因此数组处理方法的重要性可想而知;每次在处理对应数据都需要查阅一下因此记录一下使用…

MVVM框架代码逻辑整合

文章目录 逻辑总结为什么要将业务和视图分开为了解耦数据不同数据层数据冗余视图层非业务数据业务数据再处理 保证各层数据的封闭性 逻辑总结 将前端分为视图层,中间层,业务层。 视图层负责页面渲染业务层负责数据处理中间层负责业务层和视图层的关系 …

Mariadb读写分离

zzhttps://mp.csdn.net/mp_blog/creation/editor/131087599https://mp.csdn.net/mp_blog/creation/editor/131087599准本环境 systemctl stop firewalld setenforce 0 #关闭防火墙 iptables -F 192.168.1.2 #主库服务器 192.168.1.3 #从库服…

【Flutter】Flutter 使用 json_serializable 进行 JSON 序列化

文章目录 一、前言二、 json_serializable 简介三、如何在 Flutter 中安装和配置 json_serializable四、json_serializable 的基本使用五、一个实际的 Flutter 应用示例六、版本信息七、总结 一、前言 嗯啊,你好呀!欢迎来到我的博客。 今天我们要聊聊的…

基于安卓的初中英语语法APP设计与实现(源码+文档+PPT)

智能手机的普及使移动学习成为一种全新的学习方式,越来越受到研究者与学习者的关注。调查显示,移动学习对英语学习特别是应用英语的学习有良好的效果。基于Android设计开发的英语语法APP包含“练习题册”、“语法分析”、“搜索语法”三大功能模块,能够帮助学生利用碎片时间学习…

HBase(11):shell管理操作

1 status 例如:显示服务器状态 2 whoami 显示HBase当前用户,例如: 3 list 显示当前所有的表 4 count 统计指定表的记录数,例如: 5 describe 展示表结构信息 6 exists 检查表是否存在,适用于表量特别多的情况

nginxWebUI 远程命令执行漏洞

漏洞介绍 nginxWebUI是一款图形化管理nginx配置的工具,能通过网页快速配置nginx的各种功能,包括HTTP和TCP协议转发、反向代理、负载均衡、静态HTML服务器以及SSL证书的自动申请、续签和配置,配置完成后可以一键生成nginx.conf文件&#xff0c…

Adobe中修改注释签名

控制面板-> 系统和安全-> 管理工具-> 计算机管理-> 打开“计算机管理”对话框-> 在左边栏的系统工具下选择本地用户和组-> 点击“用户”->选择要改的用户名->右键重命名 打开Adobe Acrobat->点击"编辑"->首选项->注释 ->把 “登…

vue实现复制文本格式化

vue全局方法 实现复制文本格式化,方法简单实用易懂,100%成功 先上效果图 实现步骤 第一步 ,在main.js 插入以下代码 Vue.prototype.copys = function copys(text) {var isRTL = document.documentElement.getAttribute(dir) === rtl;var element = document.createElemen…

【半监督图像分割 2022 CVPR】UCC

文章目录 【半监督图像分割 2022 CVPR】UCC摘要1. 简介2. 相关工作2.1 半监督分类2.2 半监督语义分割。 3. 交叉头协同训练的半监督学习3.1 整体预览3.2 弱增强和强增强3.3 动态交叉集复制粘贴策略3.4 不确定度估计 4. 实验4.1 实验设置4.2 对比sota4.3 消融实验 5. 总结 【半监…

《移动互联网技术》第六章 资源管理: 掌握定制控件样式、界面主题、可绘制资源程序的编写方法

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Linux下的分布式迁移工具dsync使用

一、Linux下的分布式迁移工具dsync使用 dsync 是一个在 Linux 系统上用于迁移文件和目录的工具。它可以在不同的存储设备之间进行数据同步和迁移操作。dsync 是 rsync 工具的一个衍生版本,专注于在本地文件系统之间进行数据迁移。 这里是官网:dsync 1、…