【leetcode】二叉树的前序遍历➕中序遍历➕后序遍历

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 1. 二叉树的前序遍历
  • 2. 二叉树的中序遍历
  • 3. 二叉树的后序遍历

1. 二叉树的前序遍历

点击查看题目

在这里插入图片描述
在这里插入图片描述

根据提示,我们应该先动态开辟一个数组,之后按前序遍历的顺序将二叉树的值插入数组中,最后再返回这个数组。我们再来看函数给定的形参是什么:root是指向二叉树的根节点的指针,*returnsize是数组的大小,而非题目给我们已经开辟好的数组。
首先我们要想开辟数组,那么我们需要知道数组的大小,也就是二叉树的节点总数,用下面这个函数来返回节点总数

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

然后,我们将二叉树的值按前序遍历的顺序放入数组中。那数组的下标如何控制呢?一般可以用全局变量,但是要注意在每次调用下面这个函数时,将i置为0。否则进行第二次调用该函数时,数组的下标是从n(二叉树个数)开始的,而不是从0开始

int i=0;

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

基于全局变量的不方便,我们也可以采用下面这种方法,即传一个初始化为0的变量的地址进来。

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

好的,我们来看最终代码

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

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

int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int n=TreeSize(root);
    *returnSize=n;
    int* arr=(int*)malloc(sizeof(int)*n);
    int i=0;
    _preorderTraversal(root,arr,&i);
    return arr;
}

2. 二叉树的中序遍历

点击查看题目
在这里插入图片描述
在这里插入图片描述

二叉树的中序遍历和下面的后序遍历思路同上,下面就只展示代码不做解释了

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

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

int* inorderTraversal(struct TreeNode* root, int* returnSize) {
    int n=TreeSize(root);
    *returnSize=n;
    int* arr=(int*)malloc(sizeof(int)*n);
    int i=0;
    _inorderTraversal(root,arr,&i);
    return arr;
}

3. 二叉树的后序遍历

点击查看题目
在这里插入图片描述
在这里插入图片描述

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

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

int* postorderTraversal(struct TreeNode* root, int* returnSize) {
    int n=TreeSize(root);
    *returnSize=n;
    int* arr=(int*)malloc(sizeof(int)*n);
    int i=0;
    _postorderTraversal(root,arr,&i);
    return arr;
}

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

保护IP地址安全:维护网络安全

在今天的数字化时代,IP地址是互联网通信的基础,也是网络安全的重要组成部分。保护IP地址安全至关重要,因为恶意攻击者可能利用IP地址进行网络入侵、数据泄露、服务拒绝等攻击。因此,制定有效的保护措施,维护IP地址的安…

【算法】火柴排队(离散化、归并排序)

涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为: ∑i(ai−bi)^2,其中 ai 表示第一列火柴中第 i个火柴…

网络工程师之路由交换协议篇

网络工程师之路由交换篇 路由交换静态路由RIPOSPFISISBGP 以下均为个人笔记,摘录到csdn做备份 路由交换 路由 优先级 RIP 100 OSPF ASE 150 OSPF NSSA 150 IBGP 255 EBGP 255 IS-IS 15 OSPF 10 静态 60 默认开销是0 路由算法类型 D-V: 距离矢量算法 RI…

正信晟锦:老板拖工资怎么说比较合适

在职场中,老板拖欠工资是一个敏感而棘手的问题。面对这一情况,员工应保持冷静与专业,采取合适的方式表达自己的合理关切,并寻求问题的解决。 私下与老板进行沟通。选择一个适当的时机,以尊重和理解的态度开场&#xff…

【小黑送书—第十三期】>>《ARM汇编与逆向工程 蓝狐卷 基础知识》(文末送书)

与传统的CISC(Complex Instruction Set Computer,复杂指令集计算机)架构相比,Arm架构的指令集更加简洁明了,指令执行效率更高,能够在更低的功耗下完成同样的计算任务,因此在低功耗、嵌入式等领域…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS多路视频融合叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的S…

Unity中PICO中手柄按键返回值

文章目录 前言一、我们看一下每个按键返回值获取按键返回值的方法 二、我们实现一个左摇杆控制平滑移动的功能1、创建一个左摇杆控制移动的脚本2、传入XR Origin对象,并且定义一个公开变量控制移动速度3、获取到摇杆是否移动,以及移动的偏移量4、如果摇杆…

一个简单的Vue2例子讲明白拖拽drag、移入dragover、放下drop的触发机制先后顺序

几个小细节说明: 执行顺序dragstart→dragover→drop被拖拽的物体必须要设置draggable"true"(实际上只需要draggable就可以了,默认就是true),否者默认一般是不允许被拖拽的(图片除外)…

WEB前端 HTML 列表表格

列表 有序列表 使用“ol”创建“有序列表”&#xff0c;使用“li”表示“列表项” <body><ol type"1"><li>列表1</li><li>列表2</li><li>列表3</li></ol><ol type"A"><li>列表A<…

GaussDB数据库的索引管理

目录 一、引言 二、GaussDB数据库中的索引基本概念 1. 什么是GaussDB索引&#xff1f; 2. GaussDB索引的作用 三、GaussDB支持的索引类型 1. B-Tree索引 2. GIN索引 3. GiST索引 4. SP-GiST索引 四、创建和管理GaussDB索引 1. 创建索引 2. 删除索引 3. 索引的优化…

‍掌握SQL魔法:用`ORDER BY RAND()`随机化返回你的SQL查询结果!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Redis实现分布式锁源码分析

为什么使用分布式锁 单机环境并发时&#xff0c;使用synchronized或lock接口可以保证线程安全&#xff0c;但它们是jvm层面的锁&#xff0c;分布式环境并发时&#xff0c;100个并发的线程可能来自10个服务节点&#xff0c;那就是跨jvm了。 简单分布式锁实现 SETNX 格式&…

多行业万能预约门店小程序源码系统 带完整的搭建教程以及安装代码包

在数字化转型的大趋势下&#xff0c;门店预约服务已经成为提升客户体验、优化资源配置的关键环节。然而&#xff0c;市面上的预约系统往往功能单一&#xff0c;难以满足多行业的需求。小编给大家分享一款多行业万能预约门店小程序源码系统。该系统不仅具备高度的可定制性&#…

图文并茂!在Oracle VM VirtualBox上安装Ubuntu虚拟机的详细步骤指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【php基础】输出、变量、

php基础补充 1. 输出2.和"的区别3.变量3.1变量的命名规则3.2 两个对象指向同一个值3.3 可变变量 4.变量的作用域5. 检测变量 1. 输出 echo: 输出 print: 输出&#xff0c;输出成功返回1 print_r(): 输出数组 var_dump(): 输出数据的详细信息&#xff0c;带有数据类型和数…

python-redis缓存装饰器

目录 redis_decorator安装查看源代码使用 redis_decorators安装查看源代码\_\_init\_\_.pycacheable.py 各种可缓存的类型cache_element.py 缓存的元素caching.py 缓存主要逻辑 使用 总结全部代码参考 redis_decorator 安装 pip install redis_decorator查看源代码 from io …

【LeetCode热题100】 226. 翻转二叉树(二叉树)

一.题目要求 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;…

做一个58要多少钱?

做一个58要多少钱&#xff1f; 好久都没遇到这种询盘客户了&#xff0c;要是默认客户也许我会简单的勾兑下&#xff1f; 1、有没有源代码&#xff1f; 2、预算多少钱&#xff1f; 3、大概的开发周期&#xff1f; 熟悉的客户我只有一个回复&#xff1a;不做。懂得都懂&#xff…

业务版图全面扩展:维谛技术Vertiv在艾默生网络能源时代后的持续增长

近年来&#xff0c;全球数字化转型、AI算力发展等等一系列全新的趋势&#xff0c;正在构建一个全新的数字世界&#xff0c;为关键基础设施市场提供了广阔的发展机遇。 维谛技术&#xff08;Vertiv&#xff0c;NYSE&#xff1a;VRT&#xff09;作为一家拥有全球视野的专业化厂商…

每日一题:LeetCode2.两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …
最新文章