LeetCode 144. 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.mzph.cn/news/625608.shtml

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

相关文章

GitHub要求所有贡献代码的用户在2023年底前启用双因素认证

到2023年底,所有向github托管的存储库贡献代码的用户都必须启用一种或多种形式的2FA。 双重身份认证 所谓双重身份认证(Two-Factor Authentication),就是在账号密码以外还额外需要一种方式来确认用户身份。 GitHub正在大力推动双…

你知道程序员如何利用citywork实现财富自由吗?

周末到了,我要去citywalk寻找心灵的呼吸!”有谁没有设想过疲惫的工作日之后好好地去走一走,亲近大自然呢?谁又不想在闲暇之余唤起对生活的趣味呢?可是对于我们悲催的打工人而言,没有citywalk,只…

代码随想录训练营day2

一、有序数组的平方 1.1暴力解法 可以直接使用C当时自带的排序算法库函数进行计算&#xff0c;属于暴力解法&#xff0c;复杂度较高&#xff0c;那么有没有运行效率更高的算法思想呢&#xff1f; class Solution { public:vector<int> sortedSquares(vector<int&g…

1.5 面试经典150题 - 轮转数组

轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 注意&#xff1a;本题需要原地操作 class Solution(object):def rotate(self, nums, k):""":type nums: List[int]:type k: int:rtype: None Do not…

class_5:在c++中一个类包含另一个类的对象叫做组合

#include <iostream> using namespace std;class Wheel{ public://成员数据string brand; //品牌int year; //年限//真正的成员函数void printWheelInfo(); //声明成员函数 };void Wheel::printWheelInfo() {cout<<"我的轮胎品牌是&#xff1a;"<…

任务10:安装配置Java开发环境

任务描述 知识点&#xff1a; Java开发工具Maven配置 重 点&#xff1a; 安装配置Java开发工具 IDEA为IDEA配置自定义Maven&#xff08;国内源&#xff09; 内 容&#xff1a; 下载并配置JDK 1.8下载安装IDEA为IDEA配置自定义MavenWindows环境安装配置Hadoop 任务指导…

C++学习笔记(二十二)

一、函数对象 1. 函数对象概念 概念&#xff1a; 重载函数调用操作符的类&#xff0c;其对象常称为函数对象函数对象使用重载的 () 时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a; 函数对象(仿函数)是一个类&#xff0c;不是一个函数 2. 函数对…

Leetcode面试经典150题刷题记录 —— 二叉搜索树篇

Leetcod面试经典150题刷题记录-系列Leetcod面试经典150题刷题记录——数组 / 字符串篇Leetcod面试经典150题刷题记录 —— 双指针篇Leetcod面试经典150题刷题记录 —— 矩阵篇Leetcod面试经典150题刷题记录 —— 滑动窗口篇Leetcod面试经典150题刷题记录 —— 哈希表篇Leetcod面…

Python从入门到网络爬虫(正则表达详解)

Python 正则表达式 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块&#xff0c;它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根…

C#/.NET学习值得推荐的在线论坛和技术社区

前言 本文来源于知乎的一个提问&#xff0c;C#/.NET程序员学习有哪些值得推荐的在线论坛和技术社区&#xff1f;其实很早之前DotNetGuide就已经新增了C#/.NET/.NET Core充电站栏目&#xff0c;当然大家有更好的.NET相关学习站点和资源欢迎PR投稿&#x1f91e;。 GitHub - YSGS…

GO——cobra

定义 Cobra 是 Go 的 CLI 框架 CLI&#xff0c;command-line interface&#xff0c;命令行界面 使用 注意 第一个cmd的USE即使命名了也没有意义&#xff0c;一般保持和项目名一致。 示例 package mainimport ("fmt""github.com/spf13/cobra" )func …

C语言中对变量的理解

变量(variable)是程序中不可或缺的组成单位&#xff0c;是最基本的存储单元。 1.什么是变量&#xff1f; Ⅰ.概念&#xff1a; 内存中的一个存储区域&#xff0c;该区域的数据可以在同一类型范围内不断变化。 通过变量名&#xff0c;可以访问这块内存区域&#xff0c;获取里…

Nginx虚拟主机配置

目录 1.什么是虚拟主机&#xff1f; 2.准备工作(本机IP&#xff1a;10.12.153.222) 3.基于端口配置 4.基于IP配置 5.基于域名配置 1.什么是虚拟主机&#xff1f; 虚拟主机是一种特殊的软硬件技术&#xff0c;它可以将网络上的每一台计算机分成多个虚拟主机&#xff0c;每个…

Spring Boot3 系列:Spring Boot3 跨域配置 Cors

文章目录 什么是CORS&#xff1f;Spring Boot 如何配置CORS?前端代码注解配置全局配置过滤器配置 注意事项 什么是CORS&#xff1f; CORS&#xff0c;全称是“跨源资源共享”&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff0c;是一种Web应用程序的安全机制&…

信息安全导论期末复习

信息安全导论 第二章 古典密码 凯撒密码 维吉尼亚密码 仿射加密 这是一种扩展的移位变换 示例&#xff1a; 仿射加密难点在于求逆元 近代密码 希尔密码 现代密码 数学基础 辗转相除法 用于求最大公因子&#xff0c;最大公因子的值就是所列式子中最后一个不为零的余…

6.3、SDN在云计算中的应用

目录 一、SDN概念 1.1、传统网络机制 1.2、SDN网络机制 1.3、二者区别 1.4、SDN架构 二、云数据中心 2.1、公有云环境特点 2.2、两大挑战 2.3、云数据中心引入SDN技术解决两大挑战 三、SDN云计算解决方案 3.1、SDN云计算解决方案之控制平面openflow协议 3.1.…

Java-基准测试

在软件开发中&#xff0c;性能优化是一个永恒的话题。为了确保代码在生产环境中运行得尽可能快&#xff0c;开发者需要一种准确的方法来度量和比较不同代码片段的性能。Java Microbenchmark Harness&#xff08;JMH&#xff09;是一个专门为Java和其他基于JVM的语言设计的工具&…

Leetcode面试经典150题刷题记录 —— 二叉树层次遍历篇

Leetcod面试经典150题刷题记录-系列Leetcod面试经典150题刷题记录——数组 / 字符串篇Leetcod面试经典150题刷题记录 —— 双指针篇Leetcod面试经典150题刷题记录 —— 矩阵篇Leetcod面试经典150题刷题记录 —— 滑动窗口篇Leetcod面试经典150题刷题记录 —— 哈希表篇Leetcod面…

Linux的基础命令学习

pwd - 显示当前工作目录的路径 cd - 切换工作目录&#xff0c;ls - 列出当前目录的文件和子目录 rm - 删除文件或目录 mkdir - 创建新目录 rm - 删除目录 nano/vi - 编辑文本文件&#xff0c;按Enter键进入 之后按i键就可以进入写入模式 之后输入文字以后按Esc键与:q就不保…

C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录 22.1 引用其他程序集22.2 命名空间22.2.1 命名空间名称22.2.2 命名空间的补充22.2.3 命名空间跨文件伸展22.2.4 嵌套命名空间 22.3 using 指令22.3.1 using 命名空间指令22.3.2 using 别名指令22.3.3 using static 指令 22.4 程序集的结构22.5 程序集标识符22.6 强命名…