LeetCode 144. 94. 145. 二叉树的前序,中序,后续遍历(详解) ੭ ᐕ)੭*⁾⁾

目录

144.二叉树的前序遍历

一. TreeSize函数的实现:

二. preOrderTree函数的实现:

三.preorderTraversal函数的实现:

 最后完整代码:

94.二叉树的中序遍历:

 145.二叉树的后续遍历:


经过前面的二叉树的学习,现在让我们实操来练练手~如果对二叉树还不熟悉的小伙伴可以看看我的这篇博客~数据结构——二叉树(先序、中序、后序及层次四种遍历(C语言版))超详细~ (✧∇✧) Q_Q-CSDN博客

144.二叉树的前序遍历

题目描述:

题目让我们返回节点值的前序遍历,让我们一起看看题目所给的代码:

 

 函数的定义与功能:

1.定义一个TreeSize函数用于计算这颗数的节点个数

2.preOrderTree函数用于进行前序遍历

3.preorderTraversal,也就是题目所给的函数用于返回遍历后的数组大小和树的节点个数 

一. TreeSize函数的实现:

int TreeSize(struct TreeNode* root)//返回树的节点个数
{return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}

 通过判断根节点是否为空,来进行递归操作。直到将这个问题划分为一个不可再分的子问题,即根的左子树加右子树的个数在加上本身,也就是+1。具体方式见下图(函数的递归展开图)这里假设所构建的数如图所示:

二. preOrderTree函数的实现:

 这里注意是通过改变*pi的值来实现数组下标的移位,同时a也是我们要返回的数组。

void preOrderTree(struct TreeNode* root,int* a,int* pi)//前序遍历
{if(root==NULL)//如果节点为空就返回空return;a[*pi]=root->val;//给要返回的数组赋予二叉树中的值++(*pi);//通过pi来实现数组元素的移位问题preOrderTree(root->left,a,pi);preOrderTree(root->right,a,pi);
}

三.preorderTraversal函数的实现:

这里开创一个大小为size的数组,用于存储要返回的值

int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{int size=TreeSize(root);int* a=(int*)malloc(size*sizeof(int));//为数组申请一片size大小的空间int i=0;preOrderTree(root,a,&i);*returnSize=size;return a;
}

 最后完整代码:

/*** 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)//返回树的节点个数
{return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void preOrderTree(struct TreeNode* root,int* a,int* pi)//前序遍历
{if(root==NULL)//如果节点为空就返回空return;a[*pi]=root->val;//给要返回的数组赋予二叉树中的值++(*pi);//通过pi来实现数组元素的移位问题preOrderTree(root->left,a,pi);preOrderTree(root->right,a,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{int size=TreeSize(root);int* a=(int*)malloc(size*sizeof(int));//为数组申请一片size大小的空间int i=0;preOrderTree(root,a,&i);*returnSize=size;return a;
}

这里中序与后续遍历的过程与前序基本一致,就是In(post)OrderTree中对数组的赋值的位置移到了In(post)OrderTree(root->left,a,pi)的中间与后面。这里就不在赘述。直接上代码:

94.二叉树的中序遍历:

/*** 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)//返回树的节点个数
{return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void inorderTree(struct TreeNode* root,int* a,int* pi)
{if(root==NULL)return;inorderTree(root->left,a,pi);a[*pi]=root->val;++(*pi);inorderTree(root->right,a,pi);
}
int* inorderTraversal(struct TreeNode* root, int* returnSize)
{int size=TreeSize(root);int* a=(int*)malloc(size*sizeof(int));int i=0;inorderTree(root,a,&i);*returnSize=size;return a;
}

 145.二叉树的后续遍历:

/*** 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)
{return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;
}
void postorderTree(struct TreeNode* root,int* a,int* pi)
{if(root==NULL)return;postorderTree(root->left,a,pi);postorderTree(root->right,a,pi);a[*pi]=root->val;++(*pi);
}
int* postorderTraversal(struct TreeNode* root, int* returnSize)
{int size=TreeSize(root);int* a=(int*)malloc(size*sizeof(int));int i=0;postorderTree(root,a,&i);*returnSize=size;return a;
}

博客到这里也是结束了,喜欢的小伙伴可以点赞加关注支持下博主,这对我真的很重要~~

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring第七天(AOP)

简介 AOP(Aspect Oriented Programing)面向切面编程,一种编程范式,指导开发者如何组织程序结构 作用 在不惊动原始设计的基础上为其进行功能增强 Spring理念:无入侵式/无侵入式 基本概念 连接点(JoinPoint) : 程序执行过程中的任意位置&a…

如何使用 OpenCV 扫描图像、查找表和时间测量

目标 我们将寻求以下问题的答案: 如何浏览图像的每个像素?OpenCV 矩阵值是如何存储的?如何衡量我们算法的性能?什么是查找表,为什么要使用它们? 我们的测试用例 让我们考虑一种简单的颜色减少方法。通过…

令牌桶算法与Guava的实现RateLimiter源码分析

令牌桶算法与Guava的实现RateLimiter源码分析 令牌桶RateLimiter简介RateLimiter使用示例导入maven依赖编写测试代码 RateLimiter的实现源码解析SmoothRateLimiterSmoothBursty恒速获取令牌acquire(int)tryAcquire(int,long,TimeUnit) 存量桶系数小结 优缺点与漏桶的区别总结 令…

Go 知识slice

Go 知识slice 1. 什么是slice2. slice 基础2.1 定义 2.2 实现原理2.2.1 make 创建2.2.2 切片 创建 2.3 操作2.3.1 append 追加2.3.2 表达式切片2.3.3 扩展表达式2.3.4 扩容2.3.5 拷贝 3. 测试一下3.1 len && cap3.2 append && 扩容3.3 切片表达式 1. 什么是sli…

Spring第六天(注解开发第三方Bean)

注解开发管理第三方Bean 显然,我们无法在第三方Bean中写入诸如service这样的注解,所以,Spring为我们提供了Bean这一注解来让我们通过注解管理第三方Bean 第二种导入方式由于可读性太低,故只介绍第一种导入方式,这里我…

外包干了5个月,技术退步明显...

先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

内网安全管理系统(保密管理系统)

在当今信息化的时代,企业的内网已经成为其核心资产的重要组成部分。 随着企业的快速发展和信息化程度的提升,内网安全问题日益凸显,如何保障内网的安全和机密信息的保密性,已经成为企业亟待解决的问题。 内网安全管理系统(保密管…

第11章 GUI Page507 步骤三十五:处理应用退出事件

为wxFrame,生成一个EVT_CLOSE事件响应函数: 实现如下: 运行效果:关闭时,会弹出对话框询问是否保存

(蓝桥杯每日一题)love

问题描述 马上就要到七夕情人节了,小蓝在这天想要心爱得男神表白,于是她写下了一个长度为n仅由小写字母组成的字符串。 她想要使这个字符串有 1314个 love 子序列但是马虎的小蓝却忘记了当前已经有多少个子序列为 love。 请你帮小蓝计算出当前字符串有多…

初识MQ-同步异步

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、同步通讯二、异步通讯2.1.异步调用方案2.2.异步的优缺点 三、什么时MQ3.1 mq和broker3.2几种mq的优缺点对比 总结 前言 一、同步通讯 同步调用问题&#…

Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数

一、前言 众所周知,在Spring Boot框架中,Controller层API接口编码获取请求体参数时,在参数上会使用RequestBody注解;如果一次请求中,请求体参数携带的内容需要用多个参数接收时,能不能多次使用RequestBody…

【从零到一AIGC源码解析系列1】文本生成图片Stable Diffusion的diffusers实现

目录 1. 如何使用 StableDiffusionPipeline 1.1环境配置 1.2 Stable Diffusion Pipeline 1.3生成非正方形图像 2. 如何使用 diffusers 构造自己的推理管线 关注公众号【AI杰克王】 Stable Diffusion是由CompVis、StabilityAl和LAION的研究人员和工程师创建的文本到图像潜在…