当前位置: 首页 > news >正文

【二叉树】LeetCode.144:二叉树的前序遍历(小细节把握)

🎁个人主页:我们的五年

🔍系列专栏:初阶初阶结构刷题

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

目录

1.题目描述:​编辑

2.问题分析:

🍔函数解读:

🍔确定数组的大小:

🍔调用遍历函数:

3.最终代码:


 

前言:
二叉树的遍历顺序有:

1.前序:根->左子树->右子树。

2.中序:左子树->根->右子树。

3.后序:左子树->右子->树。

4.层序:一层一层的遍历。

这里我们讲二叉树的前序遍历。力扣题目链接:. - 力扣(LeetCode)

1.题目描述:

2.问题分析:

🍔函数解读:

 力扣官方给的函数接口:

int* preorderTraversal(struct TreeNode* root, int* returnSize) {

        

}

returnSize是数组的长度的地址,不是数组首地址。

而且前面还有这样一句话: * Note: The returned array must be malloced, assume caller calls free().

也就是说,还要malloc动态在堆区上申请一个数组,这样preorderTraversal这个函数销毁时,数组不随函数一起销毁,因为数组在堆区上。而且我们也不要去free(),由caller去free。

🍔确定数组的大小:

我们要去申请数组,那就要确定数组的大小,那么我们把数组的大小顶为多大呢?

题中说了节点数目在[0,100]。


📷给出下面几种情况进行选择:(看看哪种情况最好)

1.因为题目中给了最多为100个节点,所以申请100*sizeof(int)的大小?

2.先申请小一点,不够的话就再去扩容?

3.先去计算树的大小,再去扩容?

分析:

1.如果题目给的是一亿个,我们不可能去申请一亿大小的空间。而且这种情况会有空间浪费。

2.如果频繁的扩容会造成速度很慢,特别是异地扩容,realloc内部自己还要去移动数据。

3.情况三不会浪费空间,又不会频繁扩容。


所以我们先去计算树的节点个数:

分治思想:每次都把树分成三个部分,根+左子树+右子树

最小子问题根为NULL就返回0.

 int TreeSize(struct TreeNode* root){if(root==NULL)return 0;//分治,总个数等于根+加左子树的个数+右子树的个数return TreeSize(root->left)+TreeSize(root->right)+1;}

🍔调用遍历函数:

//i的作用是确定调用该函数的时候,在哪个位置插入。

并且传指针,(*i)++才能改变外部i的值。

如果是传值,i的值不能改变,同一个函数里面左子树i和右子树一样。下面右具体分析:

void preorder(struct TreeNode* root,int* a,int* i)

{

    if(root==NULL)

        return;

    a[(*i)++]=root->val;

    preorder(root->left,a,i);

    preorder(root->right,a,i);

}

int* preorderTraversal(struct TreeNode* root, int* returnSize) {

    *returnSize=TreeSize(root);

    int *a=(int*)malloc(sizeof(int)*(*returnSize));

    int i=0;

    preorder(root,a,&i);

    return a;

}

测试用例过了一半,在哪个测试用例就过不了呢?

运行测试用例都能过

如果细心一点的就可以发现,左右子树都有的时候,就过不了,只有一边有树,或者只有根就可以过。

因为这样左右子树开始时都是一样的,如果这样,调用右边的时候,又把左边已经覆盖的值又去覆盖了一遍,所以左边子树的值就没了。

3.最终代码:

/*** 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().*/int TreeSize(struct TreeNode* root){if(root==NULL)return 0;return TreeSize(root->left)+TreeSize(root->right)+1;}void preorder(struct TreeNode* root,int* a,int i)
{if(root==NULL)return;a[i++]=root->val;preorder(root->left,a,i);preorder(root->right,a,i);
}int* preorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize=TreeSize(root);int *a=(int*)malloc(sizeof(int)*(*returnSize));int i=0;preorder(root,a,i);return a;
}

相关文章:

  • 今天说的什么好呢
  • 汇编原理(二)
  • STL库 —— unordered_set与unordered_map的封装
  • 5月23日学习记录
  • 002 CentOS 7.9 redis-7.2.5安装及配置
  • idea2023的git从dev分支合并到主分支master
  • AlexNet论文解析—ImageNet Classification with Deep Convolutional Neural Networks
  • AIGC-常见图像质量评估MSE、PSNR、SSIM、LPIPS、FID、CSFD,余弦相似度----理论+代码
  • 公共代理IP和独享代理IP之间的区别?
  • Java进阶学习笔记28——StringJoiner
  • python内置函数map/filter/reduce详解
  • VLAN高级特性
  • 吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.4-3.5
  • SpringBoot如何实现跨域?
  • meinheld-gunicorn-flask VS uvicorn-gunicorn-fastapi 性能对比测试
  • Google 是如何开发 Web 框架的
  • JavaScript-如何实现克隆(clone)函数
  • python3.6+scrapy+mysql 爬虫实战
  • 分享的文章《人生如棋》
  • #Java异常处理
  • ECS应用管理最佳实践
  • idea + plantuml 画流程图
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 从零开始的无人驾驶 1
  • 分享一份非常强势的Android面试题
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何设计一个比特币钱包服务
  • 使用parted解决大于2T的磁盘分区
  • 我的面试准备过程--容器(更新中)
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # wps必须要登录激活才能使用吗?
  • #07【面试问题整理】嵌入式软件工程师
  • $(function(){})与(function($){....})(jQuery)的区别
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (Java入门)学生管理系统
  • (二)JAVA使用POI操作excel
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • @我的前任是个极品 微博分析
  • [ 蓝桥杯Web真题 ]-布局切换
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Angular] 笔记 7:模块
  • [BIZ] - 1.金融交易系统特点
  • [CF226E]Noble Knight's Path
  • [Day 65] 區塊鏈與人工智能的聯動應用:理論、技術與實踐