【数据结构】-------二叉树的四种遍历方法(递归实现)

全网最全二叉树遍历教程含代码实现 一、什么是树 树(tree)是一种经常用到的数据结构,用来模拟具有树状结构性质的数据集合。 树是n(n>=0)个结点和n-1条边的有限集。n=0时称为空树。在任意一棵非空树中: 有且仅有一个特定的称为根(root)的结点; 当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每个集合本身又是一棵树,并且称为根的子树(subtree)。 二、什么是二叉树 二叉树(binary tree)是一种更为典型的树状结构。如它名字所描述的那样,二叉树是每个节点最多有两个子树的树结构,通常 阅读详情

二叉树的数据结构主要是了解二叉树的链表结构,也就是一个数据域,两个指针域(指向左右孩子的指针) 对于二叉树来说,我们最常用的就是使用孩子表示法来表示一个树。使用根节点指针来表示一棵树,利用空指针来表示空树。

今天我们就来看看二叉树的四种遍历的方法:

先序遍历,中序遍历,后序遍历,层序遍历四种方法,我们知道的是,层序是其中最难的一种方法,今天我就在这里着重的说下。

层序遍历的方法

我们的思路是先让根结点进行入队列,然后将根节点进行入队列,然后打印根结点,出队列根结点,然后入队列根结点的左右子树,取队首元素,打印队首元素,出队列b,入队列b的左右子树,再取队首元素c,打印队首元素c,然后入队列c的左右子树,依次进行循环,当我们取到最后一个元素g的时候,我们发现我们队列为空,取队首元素为0的时候,就说明我们已经执行完毕了,这时候我们就进行层序完毕,得到最终的结果。
这里写图片描述
二叉树涉及到的四种遍历方式的代码就如下:


//树的数据结构
typedef char TreeNodeType;
typedef struct TreeNode{
    struct TreeNode* lchild;
    struct TreeNode* rchild;
    TreeNodeType data;
}TreeNode;

#define MAXSIZE  100
typedef TreeNode* SeqQType;
typedef struct SeqQ{
    SeqQType data[MAXSIZE];//定义了一个长度为100的队列
    size_t size;//记录当前顺序表的大小
    size_t head;
    size_t tail;
}SeqQ;

//树的初始化
void TreeInit(TreeNode** root)
{
    if (root == NULL)
    {
        return;
    }
    *root = NULL;
}
//前序的遍历方法
void PreOrder(TreeNode* root)
{
    if (root == NULL)
    {
        return;
    }
    //先访问根节点
    printf("%c ", root->data);
    //再访问左子树
    PreOrder(root->lchild);
    //访问右子树
    PreOrder(root->rchild);
}

//中序的遍历方法
void InOrder(TreeNode* root)
{
    if (root == NULL)
    {
        return;
    }
    //访问左子树
    InOrder(root->lchild);
    //访问根节点
    printf("%c ", root->data);
    //访问右子树
    InOrder(root->rchild);
}
//后序的遍历方法
void PostOrder(TreeNode* root)
{
    if (root == NULL)
    {
        return;
    }
    //先访问左子树
    PostOrder(root->lchild);
    //访问右子树
    PostOrder(root->rchild);
    //访问根结点
    printf("%c ", root->data);
}


void SeqQInit(SeqQ* sq){
    if (sq == NULL){
        return;
    }
    sq->size = 0;
    sq->head = 0;
    sq->tail = 0;
}

void SeqQResize(SeqQ* sq){
    if (sq == NULL){
        return;
    }
    if (sq->size <= MAXSIZE){
        return;
    }
    int size = MAXSIZE * 2 + 1;
    SeqQType* new = (SeqQType*)malloc(sizeof(SeqQType));
    int i = 0;
    for (; i<sq->size; i++){
        new[i] = sq->data[i];
    }
    free(sq->data);
}


void SeqQPush(SeqQ* sq, SeqQType  value){
    if (sq == NULL)

    {
        return;
    }
    if (sq->size >= MAXSIZE){
        SeqQResize(sq);
        return;
    }

    sq->data[sq->tail++] = value;
    if (
        sq->tail == MAXSIZE){
        sq->tail = 0;
    }
    ++sq->size;
}

void SeqQPop(SeqQ* sq){
    if (sq == NULL){
        return;
    }
    if (sq->size == 0){
        return;
    }
    ++sq->head;
    if (sq->head >= MAXSIZE){
        sq->head = 0;
    }
    --sq->size;
}
TreeNodeType SeqQFront(SeqQ* sq, SeqQType* value){
    if (sq == NULL || value == NULL){
        return 0;
    }
    if (sq->size == 0){
        return 0;
    }
    *value = sq->data[(sq->head)];//注意在这里考虑优先级的问题
    return *value;
}
//层序的遍历方法
void LevelOrder(TreeNode* root)
{
    if (root == NULL)
    {
        return;
    }
    SeqQ sq;
    SeqQInit(&sq);
    SeqQType front = root;
    SeqQPush(&sq, root);
    //将队首元素进行入队列
    while (1)
    {
        int ret ;
        ret = SeqQFront(&sq, &front);
        //返回值为空时,说明树已经访问完了,循环结束
        if (ret == -1)
        {
            break;
        }
        //访问队首元素
        printf("%c ", front->data);
        SeqQPop(&sq);
        //入队列左右子树
        if (front->lchild != NULL)
        {
            SeqQPush(&sq, front->lchild);
        }
        if (front->rchild != NULL)
        {
            SeqQPush(&sq, front->rchild);
        }
    }
    printf("\n");
}

TreeNode*  TreeNodeCreate(TreeNodeType value)//创建树结点
{
    TreeNode* newnode = (TreeNode*)malloc(sizeof(TreeNode));
    newnode->data = value;
    newnode->lchild = NULL;
    newnode->rchild = NULL;
    return newnode;
}



TreeNode* TreeCreate(TreeNodeType array[], size_t size, int *index, TreeNodeType null_node)
//根据先序遍历的结构,带有空结点的进行标记,构造成一棵树,array[] 先序遍历的结果 
//size 数组中元素个数,null_node 数组中空节点的特殊标记
{
    if (index == NULL)
    {
        return NULL;
    }
    //index表示当前取数组中的哪一个元素

    //index不在有效的范围内
    if (*index >= size){
        return NULL;
    }
    //如果该节点为空节点
    if (array[*index] == null_node)
    {
        return NULL;
    }
    //创建根结点
    TreeNode* newnode = TreeNodeCreate(array[*index]);
    //创建左子树
    ++(*index);
    newnode->lchild = TreeCreate(array, size, index, null_node);
    //创建右子树
    ++(*index);
    newnode->rchild = TreeCreate(array, size, index, null_node);
    return newnode;
}
matlab实现二叉树遍历算法(源代码) 本文介绍了在MATLAB中实现二叉树算法的基本步骤。首先,定义了一个名为TreeNode的结构体,用于存储二叉树节点的数据以及指向左右子节点的引用。接着,实现了几个函数来操作这个二叉树,包括insertNode用于插入新节点,以及preorderTraversal、inorderTraversal和postorderTraversal分别用于执行前序、中序和后序遍历。这些函数都采用了递归的实现方式。最后,给出了一个示例,展示了如何创建一个空的二叉树,通过insertNode函数插入节点,并使用遍历函数来展示树的结构。这段代码为MATLAB用户提供了一个简单的框架,用于实现和操作二叉树数据结构。 立即下载

相关推荐

MATLAB 遍历算法

对于深度优先遍历算法的一道例题的程序编辑 仅供参考 对于深度优先遍历算法的一道例题的程序编辑 仅供参考 对于深度优先遍历算法的一道例题的程序编辑 仅供参考 对于深度优先遍历算法的一道例题的程序编辑 仅供参考

(数据结构)二叉树层次遍历

二叉树层次遍历 二叉树层次遍历的实现思想是:通过队列数据结构,从树的根结点开始,依次将其左孩子和右孩子入队;而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后顺序就是层次遍历的最终结果 图1 二叉树 以上图 1 为例,层次遍历的过程如下: 首先,根结点 1 入队 根结点 1 出队,出队的同时,将左孩子 2 和右孩子 3 分别入队 队头结点 2 出队,出队的同时,将结点 2 的左孩子 4 和右孩子 5 依次入队 队头结点 3 ...

weixin_51927215的博客 1万+

数据结构——二叉树的四种遍历

花了不少时间 给整的 希望对出学者有好处 是二叉树实验经常用到的

二叉树的四种遍历算法

二叉树在作为一种重要的数据结构,它的很多算法的思想在很多地方都用到了,比如说大名鼎鼎的 STL 算法模板,里面的优先队列(priority_queue)、集合(set、map)等等都用到了二叉树里面的思想,如果有兴趣的小伙伴可以去查找一些这些方面的资料。但是我们现在先不讨论那么高深的数据结构,我们先从二叉树的遍历开始:先来看一下二叉树长什么样子:这是百度来的一张二叉树图,我们可以看到, 这棵二叉树一

指点 3万+

遍历算法遍历方案及几个算法实现

1.遍历方案  从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:  (1)访问结点本身(N),  (2)遍历该结点的左子树(L),  (3)遍历该结点的右子树(R)。 以上三种操作有六种执行次序:  NLR、LNR、LRN、NRL、RNL、RLN。

彻底清理Easy Connect残留:从服务到驱动的完整卸载指南

在企业网络接入场景中,远程客户端常因内核驱动、系统服务和网络过滤组件导致卸载残留,进程无法结束、文件被锁定、注册表项顽固存在。其原理在于驱动挂载网络协议栈,服务守护进程,卸载时资源占用导致清理不彻底。彻底清理的技术价值在于恢复系统纯净、避免网络异常和软件冲突。典型应用场景包括企业办公机、个人笔记本更换或重装客户端。本文针对深信服Easy Connect,提供从停止服务、删除驱动到清理注册表和虚拟网卡的分步操作链路,并给出验证方法和避坑经验。

weixin_31292729的博客 239

树的层次遍历

二叉树的前序、中序、后序遍历我想大家应该都很熟悉了,那我们今天就来讲一下二叉树的层次遍历。 二叉树的前序、中序、后序遍历需要用到栈(递归的过程也就是一个栈),层次遍历需要借助队列这个数据结构。 层次遍历的思路 我们给出一个二叉树: 这棵二叉树的层次遍历次序为:A、B、C、D、F、G 以人的思维来看层次遍历貌似比前、中、后序遍历更加简单易懂,但是程序到底如何实现这样的效果呢...

听得到微笑的博客 4万+

ISO26262功能安全--产品开发过程

目录 1.总体理解 2.概念阶段——吹牛,我们是打草稿的 2.1 相关项定义 2.2 HARA分析 2.3 功能安全目标 2.4 安全需求与安全概念 3. 系统阶段——闭门造神车,我们开始修炼 3.1 技术安全需求(TSC) 3.2 系统架构设计 3.3 安全分析与独立性分析 3.4 软硬件接口(HSI) 4. 硬件阶段——苦其心志,苦练经骨 4.1 硬件架构...

AgingMoon的博客 1万+

数据结构与算法:二叉树1:前中后三种遍历/DFS/BFS的递归/非递归原理和板子、判断是否为二叉搜索树BST、完全二叉树、满二叉树、平衡二叉搜索树、反转二叉树

很有意思的一个全新的角度:从递归序去看前中后三种遍历。首先来看一颗二叉树:和其遍历的函数那么这颗树的递归序便是1,2,4,4,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1可以看到,任何一颗二叉树的节点的递归序实际上都会经过其自身三次。前序遍历、中序遍历、后续遍历就是在这三次中选取不同时候进行处理而已。譬如前序遍历便是经过自身第一次时就进行处理,这里假设为简单打印。那么就能很快地得到前序遍历的顺序为:1,2,4,5,3,6,7。

shanshan的博客 1344

WPF MVVM实战:构建可绑定的RichTextBox富文本编辑器

本文详细介绍了如何在WPF MVVM模式下构建可绑定的RichTextBox富文本编辑器,解决标准RichTextBox.Document属性不支持数据绑定的问题。通过创建自定义BindableRichTextBox控件,实现FlowDocument的绑定支持,并分享插入图片、文本格式控制等实战技巧,帮助开发者高效开发富文本编辑功能。

weixin_33717117的博客 307

STM32CubeMX + HAL库避坑指南:为什么你的代码总在SystemClock_Config卡住?

本文深入剖析了STM32开发者在使用STM32CubeMX和HAL库时,代码在SystemClock_Config函数中卡死的根本原因。文章不仅指出硬件时序、Flash延迟配置等常见陷阱,更提供了从硬件设计、软件容错到深度调试的系统性解决方案,帮助开发者构建鲁棒的时钟初始化策略,彻底告别启动卡顿问题。

bb456的博客 928

数据结构之树(二)——二叉树(4 遍历算法的递归实现)

先序遍历实现 方法描述: 若二叉树为空,则空操作: 若二叉树非空,      访问根结点(D)      先序遍历左子树(L)      先序遍历右子树® 例子: 上图中的二叉树,访问顺序如下图, 如果用二叉链表来表示上图的访问,则有, 在二叉链表中,对各结点的访问也是递归的,所以对于先序遍历的...

daocaoren_的博客 492

中微8S6990外设开发实战:从GPIO配置到低功耗休眠的完整指南

本文提供了中微8S6990增强型8051单片机从GPIO配置到低功耗休眠的完整实战指南。详细讲解了开发环境搭建、GPIO灵活配置、定时器中断、ADC采样优化、PWM电机控制等核心外设的编程要点与避坑技巧,并重点阐述了实现超低功耗休眠的系统性外设管理策略,帮助开发者快速上手并优化产品续航。

weixin_29162439的博客 533

【数据结构】二叉树的创建和四种遍历(附带详细注释)

树是一种比起线性表更加复杂的存储结构,其是一种非常重要的非线性数据结构,树结构在客观世界中普遍存在,其中二叉树的运用最为广泛。本篇文章主要介绍了二叉树的链式存储结构(即二叉链表)的创建与遍历,这将为以后对二叉树的研究起到至关重要的作用。............

weixin_65334260的博客 4926

嵌入式工程师成长之路(2)——电路设计

为什么你的电源模块总是发热炸机?DC/DC和LDO选型的“潜规则”你踩坑了吗? LM2596降压芯片用错电容导致输出振荡?LED恒流驱动设计让灯珠寿命缩水50%?24V转12V方案成本超预算被老板狂喷?——这些血泪教训,谁能懂得!

云轩阁 13万+

从零开始:手把手教你设计人形机器人锂电池供电系统

人形机器人要像人类一样“活起来”,必须有稳定的“能量血液”——供电系统。本文聚焦锂电池供电系统如何根据机器人功耗选择合适的锂电池参数(容量、电压、放电倍率);如何设计电池管理系统(BMS)保护电池安全;如何解决机器人运动时的“瞬时大电流”供电难题;如何通过硬件电路和代码实现供电系统的监测与控制。用“机器人小助手的能量危机”故事引入锂电池供电系统;拆解锂电池核心参数(容量、电压、放电倍率)和供电系统三大组件(电池组、BMS、电源转换模块);

AI天才研究院 1759

数据结构——二叉树的构建+四种遍历(递归、非递归)

二叉树的结构定义 package com.kexin.common; /** * @Author KeXin * @Date 2019/4/4 上午10:51 **/ public class TreeNode { char val; TreeNode left; TreeNode right; public TreeNode(char x) { ...

小黄鸭的博客 409

python实现边缘检测Canny算子 (附完整源码)

python实现边缘检测Canny算子 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 457

非递归后序遍历二叉树总结

前言 关于之前写的非递归遍历二叉树的一份代码由于当时图省事几乎没有注释,导致今天再次看代码时比较费劲。这份代码是纯C写的,设计到许多栈、指针的操作,可读性不高,于是现在通过这份博客对于非递归后序遍历二叉树进行一个总结回顾。以及完善当时的部分注释。文章链戳这里 正文 进入正题,关于遍历二叉树常用的方法是递归遍历。优点是代码量小,逻辑精炼,可读性高。而对于递归实际上在底层的汇编代码中,是开辟了一个系...

小胡同的诗 1106

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

二叉树遍历的递归、非递归方法(前序、中序、后序,层序)——Java实现

1. 二叉树的前序遍历(深度优先遍历) 二叉树的节点定义 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归实现: public class MyTest { static ArrayList<Integer> li...

一只特立独行的猪 418

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

二叉树层序遍历递归与非递归_二叉树的遍历-递归和非递归

盗图前言最近准备面试 ,复习了一下数据结构 中的二叉树,整理了二叉树的前序、中序、后序、深度和广度遍历以及递归和非递归实现方法,如有好的方案大家可以一起讨论。前序遍历先遍历根节点,然后再遍历左子树,最后再遍历右子树java 示例:/** * 前序遍历 */public void previousTraverse() { if (Objects.nonNull(root)) { doPrevious...

weixin_39881760的博客 144

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

二叉树的四种遍历详解(先序,中序,后序,层次)

详细讲解了二叉树的四种遍历,用画图的方式帮助大家理解(包括二叉树的图),并给出例题供读者学习,文中的所有代码均经过调试。

2301_80035594的博客 8767

二叉树的四种基本遍历方式(C语言)

二叉树的四种基本遍历方式,前序遍历、后序遍历、中序遍历、层次遍历,非递归实现(C语言版本)

qq_42659832的博客 4871

二叉树非递归遍历方式

#include<stdio.h> #include<stdlib.h> //描述单一个体,起别名 typedef struct treeNode { char data; //数据域用字符表示 struct treeNode* LChild; //左子树指针 struct treeNode*RChild; //右子树指针 }TREE,*LPTREE; //一般用用LP开头的,表示指针别名 //创建二叉树结点 LRTREE createNo

qq_51491080的博客 139

重生之我在二叉树的遍历详细教程

二叉树的基本概念二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。特殊的二叉树包括满二叉树、完全二叉树和平衡二叉树等。遍历方法前序遍历:根节点 -> 左子树 -> 右子树。中序遍历:左子树 -> 根节点 -> 右子树。后序遍历:左子树 -> 右子树 -> 根节点。层次遍历:按层次从上到下、从左到右依次访问。递归实现递归实现遍历方法较为直观,通过函数调用自身来实现对子树的遍历。

m0_72216164的博客 1238
上一篇: 线程控制(二)------线程等待、分离与结合属性
下一篇: 网络基础(一)---------认识网络
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值