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

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

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.mzph.cn/news/837136.shtml

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

相关文章

aigc的基础知识介绍

AIGC,即人工智能生成内容(Artificial Intelligence Generated Content),是一种利用人工智能技术自动生成各种形式内容的技术。以下是关于AIGC的基础知识介绍: 定义:AIGC指的是利用人工智能技术和算法来自动生成各种形式的内容,如文本、图像、音频和视频等。 发展历程:A…

LeetCode题练习与总结:不同的二叉搜索树Ⅱ--95

一、题目描述 给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,nul…

Unity自定义动画-Animation动画数据-How is “fileIDToRecycleName“ generated

一般美术和程序分工明确的项目 fbx确实是和动画一一对应的&#xff1b; 但一些独立&#xff0c;或者小工作室的项目&#xff0c;就没法保证了&#xff0c;关键还是在于 Unity的 .meta 目录 查找和对比了一下 .fbx 和 .meta&#xff1a; 缓存和不缓存Animation 具体的Animat…

HCIP-Datacom-ARST自选题库_03_VLAN【26道题】

一、单选题 1.QinQ技术是一项扩展VLAN空间的技术&#xff0c;通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的功能。下列关于QinQ说法错误的是 灵活QinQ可以根据不同的内层Tag而加上不同的外层Tag&#xff0c;对于用户VLAN的划分更加细致 QinQ使VLA…

Golang | Leetcode Golang题解之第86题分隔链表

题目&#xff1a; 题解&#xff1a; func partition(head *ListNode, x int) *ListNode {small : &ListNode{}smallHead : smalllarge : &ListNode{}largeHead : largefor head ! nil {if head.Val < x {small.Next headsmall small.Next} else {large.Next hea…

栈的详尽技术分析

栈的详尽技术分析 一、引言 在计算机科学的领域中&#xff0c;数据结构是组织和管理数据的方式&#xff0c;对于编写高效算法而言至关重要。栈作为一种特殊的数据结构&#xff0c;其应用广泛&#xff0c;对理解程序语言的编译、内存管理以及算法设计等方面都有重要意义。 二、栈…

ue引擎游戏开发笔记(39)——npc的ai设定:追踪玩家以及瞄准

1.需求分析&#xff1a; 实现对npc的击杀和死亡反馈后&#xff0c;下一步需要赋予npc基本的ai&#xff0c;首先就是敌人要能够追踪或者说跟随玩家&#xff0c;这才能为后续npc开枪&#xff0c;对射做好准备&#xff0c;首先实现追踪玩家。 2.操作实现&#xff1a; 1.思路&…

代码随想录第六天打卡|242.有效的字母异位词,349. 两个数组的交集,202. 快乐数

242.有效的字母异位词 Python from collections import Counter class Solution:def isAnagram(self, s: str, t: str) -> bool:nCounter(s)mCounter(t)return nm C class Solution { public:bool isAnagram(string s, string t) {int Map[26]{0};for (int i0;i<s.s…

数据结构填空题专项.docx

1. 根据数据元素间关系的不同特性&#xff0c;通常可分为集合、线性 、树形 、图状 四 类基本结构。 2. 算法的 5 个特征包括&#xff1a; 有穷性、确定性 、有效性、输入和输出。 3. 数据结构中的数据元素存在“一对多”的关系称为 树形 结构。 4. 在包含 n 个元素的…

2024.5组队学习——MetaGPT智能体理论与实战(待续)

学习资料&#xff1a;项目地址——hugging-multi-agent、在线阅读、MetaGPT项目、MetaGPT中文文档 文章目录 一、环境配置1.1 配置MetaGPT1.2 配置大模型api_key1.3 测试demo 一、环境配置 全部工作在Autodl上完成&#xff0c;下面是简单记录&#xff1a; 1.1 配置MetaGPT 下…

不好!有敌情,遭到XSS攻击【网络安全篇】

XSS&#xff1a;当一个目标的站点&#xff0c;被我们用户去访问&#xff0c;在渲染HTMl的过程中&#xff0c;出现了没有预期到的脚本指令&#xff0c;然后就会执行攻击者用各种方法注入并执行的恶意脚本&#xff0c;这个时候就会产生XSS。 涉及方&#xff1a; 用户&#xff0…

前端铺子-uniapp移动端:跨平台开发新篇章

一、引言 在移动应用开发领域&#xff0c;随着技术的不断进步&#xff0c;用户对应用的需求也日益多样化。如何快速、高效地开发跨平台应用成为了前端开发者面临的一大挑战。uni-app作为一款使用Vue.js开发所有前端应用的框架&#xff0c;凭借其一次编写、多端运行的特性&…

Vue Excel 文件流导出乱码快速解决方案

今日在开发一个导出功能&#xff0c;原本一个非常简单的功能&#xff0c;却没想里面藏了陷阱&#xff01; 背景 前端导出的文件流乱码&#xff0c;此时确定非后端问题&#xff08;可以在postman导出是否正常来判断&#xff09;。 前端导出&#xff1a; 后端正常数据&#xf…

Nature 综述(IF=88):微生物群落和土壤性质之间的相互作用

随着社会的发展&#xff0c;环境污染和自然资源的消耗日益严重&#xff0c;土壤生态系统的健康状况备受关注。然而&#xff0c;当前研究领域存在一个问题&#xff0c;即在研究土壤微生物群落结构的同时&#xff0c;忽略了微生物对土壤环境的影响。本文旨在探讨微生物如何通过生…

『大模型笔记』MIT 最新的科尔莫戈洛夫-阿诺德网络(Kolmogorov-Arnold Network,KAN)简介

MIT 最新的科尔莫戈洛夫-阿诺德网络(Kolmogorov-Arnold Network,KAN)简介 文章目录 一. 探索 AI 下一前沿:科尔莫戈洛夫-阿诺德网络(KAN)1.1 基础回顾:多层感知器(MLPs)1.2 引入科尔莫戈洛夫-阿诺德网络(KAN)1.3 神经网络架构的开创性变革四. 参考文献内容出自:htt…

submitUpload() { this.$refs.upload.submit(); },

submitUpload() {this.$refs.upload.submit();}, submitUpload() 是一个函数&#xff0c;调用该函数会将 Vue 组件中的上传组件中的文件上传到服务器上。这个函数通过 this.$refs.upload.submit() 来实现&#xff0c;其中 this.$refs.upload 可以获取到上传组件的 DOM 对象&am…

js怎么判断视频链接是否能播放

标题js怎么判断视频链接是否能播放 这个函数用提供的URL创建一个新的Video元素&#xff0c;并根据视频是否可以播放来解析一个Promise。它监听canplaythrough事件来确定视频是否可播放&#xff0c;并监听error事件来处理可能发生的任何错误。 function canPlayVideo(url) {re…

【树】简要理解树的概念

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、树的概念2、树的相关概念3、结语 1、树的概念 树是一种非线性的数据结构&#xff0c;它…

js通过音频链接获取音频时长

js通过音频链接获取音频时长 要在JavaScript中从音频链接获取音频文件的持续时间&#xff0c;您可以使用fetch API来检索音频文件&#xff0c;然后使用audio API来获取持续时间。例子: function getAudioDuration(audioUrl) {return fetch(audioUrl).then((response) > re…

C#语言进阶

一、简单数据结构类 1. ArrayList ArrayList是一个 C# 为我们封装好的类&#xff0c;它的本质是一个 object 类型的数组。ArrayList类帮助我们实现了很多方法&#xff0c;比如数组的增删查改 1.1 声明 using System.Collections;ArrayList array new ArrayList(); 1.2 增…