二叉树的前序、中序、后序遍历

二叉树的前序、中序、后序

1.二叉树的前序遍历

题目:

二叉树的前序遍历

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

示例 1:

img

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

img

输入:root = [1,2]
输出:[1,2]

示例 5:

img

输入:root = [1,null,2]
输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

思路:

  1. 其实就是要让二叉树前序遍历
  2. 但是题目需要我们将遍历到的节点的值放进数组里面,而我们又不知道二叉树有多少个节点,这样就不知道数组要开辟多少空间,
  3. 因此我们需要先编写一个获取二叉树节点个数的函数
  4. 然后就让前序遍历二叉树,把遍历到的值放进数组中就行了
  5. 但是需要注意的是,传数组的下标i进去的时候,需要传址调用(因为我们采用递归来实现前序遍历)

代码:

struct TreeNode 
{int val;struct TreeNode* left;struct TreeNode* right;};/** Note: The returned array must be malloced, assume caller calls free().*/typedef struct TreeNode TreeNode;// 获取二叉树的节点个数
int TreeSize(TreeNode* root)
{if (root == NULL){return 0;}return 1 + TreeSize(root->left) + TreeSize(root->right);
}// 前序遍历  (递归实现)
void _preorderTraversal(TreeNode* root, int* retArr, int* pi)
{if (root == NULL)return;retArr[(*pi)] = root->val; // i 的值我们通过解引用去拿到(*pi)++;_preorderTraversal(root->left, retArr, pi);_preorderTraversal(root->right, retArr, pi);
}int* preorderTraversal(struct TreeNode* root, int* returnSize)
{// 创建一个数组 空间个数是二叉树的节点数int* retArr = (int*)malloc(sizeof(int) * TreeSize(root));// 前序遍历 (要把二叉树节点的值 放进retArr数组中)int i = 0;_preorderTraversal(root, retArr, &i);// 这里是一定要传 i的地址的,不然每次递归的时候,都会开辟新的函数栈帧,i的值无法被改变。 传值调用// 传地址进去就是 传址调用*returnSize = TreeSize(root);return retArr;
}

要注意递归展开的过程,理解了就能知道为什么要传址调用了。

2.二叉树的中序遍历

题目:

二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

示例 1:

img

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

思路:

中序遍历 - 左子树 ——根——右子树

除了要在递归的时候注意顺序,其他思路和前序是一样的。

代码:

typedef struct TreeNode TreeNode;// 获取二叉树节点个数
int TreeSize(TreeNode* root)
{if (root == NULL)return 0;// 二叉树节点个数 = 1 + 左子树节点个数 + 右子树节点个数return 1 + TreeSize(root->left) + TreeSize(root->right);
}// 中序遍历
void _inorderTraversal(TreeNode* root, int* retArr, int* pi)
{if (root == NULL)return;// 这里我们要中序遍历,【左子树 根 柚子树】_inorderTraversal(root->left, retArr, pi);retArr[(*pi)] = root->val;(*pi)++;_inorderTraversal(root->right, retArr, pi);
}int* inorderTraversal(struct TreeNode* root, int* returnSize)
{// 要将遍历到的节点放进数组中// 我们不知道二叉树节点多少,也就不知道数组要开辟多少空间。因此需要自己写一个获取二叉树节点个数的函数int size = TreeSize(root);int* retArr = (int*)malloc(sizeof(int) * size);//中序遍历)(递归实现)int i = 0;_inorderTraversal(root, retArr, &i);*returnSize = size;return retArr;
}

3.二叉树的后序遍历

题目:

二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历

示例 1:

img

输入:root = [1,null,2,3]
输出:[3,2,1]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

提示:

  • 树中节点的数目在范围 [0, 100]
  • -100 <= Node.val <= 100

思路:

后序遍历 - 左子树——右子树——根

注意递归时的调用顺序,其他思路和前序中序差不多。

代码:

struct TreeNode 
{int val;struct TreeNode* left;struct TreeNode* right;};/** Note: The returned array must be malloced, assume caller calls free().*/typedef struct TreeNode TreeNode;// 获取二叉树的节点个数
int TreeSize(TreeNode* root)
{if (root == NULL){return 0;}return 1 + TreeSize(root->left) + TreeSize(root->right);
}// 后序遍历
void _postorderTraversal(TreeNode* root, int* retArr, int* pi)
{if (root == NULL)return;// 后序遍历 【左子树 右子树 根】_postorderTraversal(root->left, retArr, pi);_postorderTraversal(root->right, retArr, pi);retArr[(*pi)] = root->val;(*pi)++;
}int* postorderTraversal(struct TreeNode* root, int* returnSize)
{// 要将遍历到的节点放进数组中// 我们不知道二叉树节点多少,也就不知道数组要开辟多少空间。因此需要自己写一个获取二叉树节点个数的函数int size = TreeSize(root);int* retArr = (int*)malloc(sizeof(int) * size);// 后序遍历(递归实现)int i = 0;_postorderTraversal(root, retArr, &i);*returnSize = size;return retArr;
}

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

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

相关文章

Typescript 哲学 - d.ts文件

The .d.ts syntax intentionally looks like ES Modules syntax. ES Modules was ratified by TC39 in 2015 as part of ES2015 (ES6), while it has been available via transpilers for a long time default export (esModuleInterop:true) / export 讲一个 d.ts export 的…

小程序的小组件

进度的组件 文字换行过滤 以及 排序 简单易懂 只为了记录工作 <template><div><ProgressBar :progress"progress" /><button click"increaseProgress">增加进度</button><view class"goods-name">12…

鸿蒙ArkUI开发:常用布局【主轴】

ArkUI中常用布局容器 线性布局&#xff08;Row/Column&#xff09; 线性布局的子元素在线性方向上&#xff08;水平方向和垂直方向&#xff09;依次排列线性布局容器包括[Row]和[Column]。Column容器内子元素按照垂直方向排列&#xff0c;Row容器内子元素按照水平方向排列开发…

一道dp错题

dis(a,b)就是两点之间的距离公式 那么这道题该怎么解呢,.先看数据范围x,y<1e4,so,18个点两点之间距离最大18*1e4*sqrt(2)<2^18,所以如果跳过的点大于18个点,那么显然一个区间内最多不会跳跃超过17个点 现在我们想知道前i个点跳跃几次在哪跳跃能够达到最小花费,不妨设跳…

whisper报错:hp, ht, pid, tid = _winapi.CreateProcess [WinError 2] 系统找不到指定的文件。

in _execute_child hp&#xff0c; ht&#xff0c; pid&#xff0c; tid _winapi.CreateProcess&#xff08;executable&#xff0c; args&#xff0c; FileNotFoundError&#xff1a; [WinError 2] 系统找不到指定的文件。 原因&#xff1a; 没装ffmpeg 或者 ffmpeg没添加到…

VUE2+ffmpeg处理非h264编码格式视频

1、安装npm install ffmpeg/ffmpeg0.10.0 ffmpeg/core0.9.8 video.js8.12.0 2、在vue.config.js中devServer配置 headers: {// 如果需要用到ffmpeg确保ShareArrayBuffer能够正常使用,可能会有安全隐患Cross-Origin-Embedder-Policy: require-corp,Cross-Origin-Opener-Policy:…

【408精华知识】提高外部排序速度的三种方式

文章目录 一、败者树二、置换-选择排序三、最佳归并树 一、败者树 还没写完… 二、置换-选择排序 三、最佳归并树 写在后面 这个专栏主要是我在学习408真题的过程中总结的一些笔记&#xff0c;因为我学的也很一般&#xff0c;如果有错误和不足之处&#xff0c;还望大家在评…

Flink HA模式下JobManager切换时发送告警

资源&版本信息 Flink版本1.14.6 运行平台&#xff1a;K8s HA使用ZK&#xff08;使用K8s的ETC应该是一个道理&#xff09; 详解Flink HA原理 Flink启动时会创建HighAvailabilityServices提供HA和相关基础服务&#xff0c;其中包括leaderRetrievalService和LeaderElecti…

MySQL5.7压缩包安装图文教程

一、下载 https://dev.mysql.com/downloads/mysql/ 选择5.7版本 二、解压 下载完成后解压&#xff0c;解压后如下&#xff08;zip是免安装的&#xff0c;解压后配置成功即可使用&#xff09; 注意&#xff1a;只有5.6以前的版本才有在线安装&#xff08;install msi&#xf…

用友U8与旺店通的对接案例分析

在现代企业管理中&#xff0c;财务管理和电商运营管理是企业数字化转型的两个重要组成部分。用友U8作为企业的财务管理系统&#xff0c;与旺店通这一电商ERP系统的结合&#xff0c;可以为企业带来全面的数据整合和流程自动化。本文将通过轻易云集成平台的视角&#xff0c;分析用…

2024统计建模成品论文39页(附带完整数据集和代码)

2024统计建模成品论文完整版一等奖论文【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/

安科瑞AIM-D100-ES光伏储能系统直流绝缘监测仪

概述 AIM-D100-ES 型直流绝缘监测仪主要用于在线监测直流不接地系统正负极对地绝缘电阻&#xff0c;当绝缘电阻低于设定值时&#xff0c;能发出预警和报警信号。 产品可测 100-1500V 的直流系统&#xff0c;可应用于储能直流系统、电动汽车充电装置、UPS 供电系统、光伏直流系…