十三、数据结构——二叉树的遍历(先序、中序和后序)详细思路和代码

news2024/10/7 18:22:09

二叉树遍历

在数据结构中,二叉树是一种常用且重要的数据结构。二叉树的遍历是指按照一定顺序访问二叉树的所有节点,常见的遍历方式有前序遍历、中序遍历和后序遍历。本文将详细介绍这三种遍历算法,并介绍最优二叉树。

二叉树的基本定义

首先,我们先来了解一下二叉树的基本定义。二叉树是每个节点最多有两个子节点的树结构。每个节点都可以有左子节点和右子节点,也可以没有子节点。二叉树可以为空,即没有任何节点。

1、前序遍历

前序遍历是先访问根节点,然后按照左子树、右子树的顺序递归遍历。前序遍历的访问顺序为“根左右”。
在这里插入图片描述

代码

void preOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    printf("%c ", root->data);
    preOrderTraversal(root->left);
    preOrderTraversal(root->right);
}

2、中序遍历

中序遍历是先按照左子树的顺序递归遍历,然后访问根节点,最后按照右子树的顺序递归遍历。中序遍历的访问顺序为“左根右”。
在这里插入图片描述

代码

void inOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    inOrderTraversal(root->left);
    printf("%c ", root->data);
    inOrderTraversal(root->right);
}

3、后序遍历

后序遍历是先按照左子树、右子树的顺序递归遍历,然后访问根节点。后序遍历的访问顺序为“左右根”。
在这里插入图片描述

代码

void postOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    postOrderTraversal(root->left);
    postOrderTraversal(root->right);
    printf("%c ", root->data);
}

全部代码(这里是递归的方式,也可以是用队列或者是栈来实现,但是有点麻烦)

①tree.h

#ifndef _TREE_H_
#define _TREE_H_
#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
    char data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

//创建树
TreeNode* createTree();

//先序
void preOrderTraversal(TreeNode* root);

//中序
void inOrderTraversal(TreeNode* root);

//后序
void postOrderTraversal(TreeNode* root);

#endif

②tree.c

#include "tree.h"
//创建树
TreeNode* createTree() {
    char ch;
    scanf("%c", &ch);
    if (ch == '#') {
        return NULL;
    }

    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
    newNode->data = ch;
    newNode->left = createTree();
    newNode->right = createTree();

    return newNode;
}

//先序
void preOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    printf("%c ", root->data);
    preOrderTraversal(root->left);
    preOrderTraversal(root->right);
}

//中序
void inOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    inOrderTraversal(root->left);
    printf("%c ", root->data);
    inOrderTraversal(root->right);
}

//后序
void postOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    postOrderTraversal(root->left);
    postOrderTraversal(root->right);
    printf("%c ", root->data);
}

③tree_main.c

#include "tree.h"
#include "tree.c"
int main() {
    printf("输入先序序列(包含null节点,使用#表示):\n");
    TreeNode* root = createTree();

    printf("构造的二叉树先序遍历结果为:\n");
    preOrderTraversal(root);

    printf("\n构造的二叉树中序遍历结果为:\n");
    inOrderTraversal(root);

    printf("\n构造的二叉树后序遍历结果为:\n");
    postOrderTraversal(root);

    return 0;
}

运行结果

在这里插入图片描述
和上面我们画图连线是一样的结果。

1、由先序和中序求后序

先序:A B C E F G H D I J K L M
中序:E C B G F H A J I K D M L
求后序?

在这里插入图片描述

2、由后序和中序求先序

中序:E C B G F H A J I K D M L
后序:E C G H F B J K I M L D A
求先序?

在这里插入图片描述

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

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

相关文章

网络摄像机·监控摄像机用镜头驱动芯片(内置光圈控制)MS41908M

产品简述 MS41908M 是一款用于网络摄像机和监控摄像机的镜头 驱动芯片。 芯片内置光圈控制功能&#xff1b;通过电压驱动方式以及扭矩纹 波修正技术&#xff0c;实现了超低噪声微步驱动。 主要特点  电压驱动方式&#xff0c;256 微步驱动电路&#xff08;两通道&…

同一份数据,Redis为什么要存两次

Redis作为目前最主流的高性能缓存&#xff0c;里面有很多精妙的设计&#xff0c;其中有一种数据类型&#xff0c;当在存储的时候会同时采用两种数据结构来进行分别存储&#xff0c;那么 Redis 为什么要这么做呢&#xff1f;这么做会造成同一份数据占用两倍空间吗&#xff1f; …

Python中的元类MetaClass

引言 python中的元类MetaClass&#xff1a;本质也是一个类&#xff0c;但和普通类的用法不同&#xff0c;它可以对类内部的定义&#xff08;包括类属性和类方法&#xff09;进行动态的修改。 换句话说&#xff0c;使用元类的主要目的是为了实现在创建类时&#xff0c;能够动态…

数据库架构设计

数据库架构设计 数据库架构分类 介绍 介绍常见的 四种 数据库架构设计模型&#xff1a; 单库架构、分组架构、分片架构和分组分片架构 &#xff0c;以及每种架构的 使用场景、存在的问题和对应的解决方案 。 一、数据模型 我们以 “ 用户中心 ” 数据库作为 数据模型 &…

python核心-面向对象-方法相关-补充

class Person:__age 18def __run(self):print("pao")def _Person__run(self):print("xxx")p Person # p._Person__run()print(Person.__dict__) 内置特殊方法 信息格式化操作 # class Person: # def __init__(self, n, a): # self.name n …

深入理解Linux 内核追踪机制

Linux 存在众多 tracing tools&#xff0c;比如 ftrace、perf&#xff0c;他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念&#xff0c;诸如 tracepoint、trace events、kprobe、eBPF 等&#xff0c;甚至让人搞不清楚他们到底是干什么的。本文尝试理清…

硬件——PCI-E接口

简介 PCI PCI&#xff08;Peripheral Component Interconnect&#xff09;&#xff0c;外设组件互联标准。 并行方式通信 PCI接口通常是白色的。 PCI接口分为32Bit和64Bit&#xff0c;主流的是32Bit&#xff0c;最大传输速度133MB/s。 适用于网卡、声卡等&#xff1b;现在…

flask中的session介绍

flask中的session介绍 在Flask中&#xff0c;session是一个用于存储特定用户会话数据的字典对象。它在不同请求之间保存数据。它通过在客户端设置一个签名的cookie&#xff0c;将所有的会话数据存储在客户端。以下是如何在Flask应用中使用session的基本步骤&#xff1a; 首先…

Midjourney8种风格极其使用场景(1)

目录 ​编辑 引言 等距动画 场景 分析性绘图 场景 着色书 场景 信息图画 场景 双重曝光 场景 图示性绘画 场景 二维插图 场景 图解式画像 场景 总结&#xff1a; 八种风格箴言&#xff1a; 引言 我相信大家都或多或少玩过Midjourney&#xff0c;但是要形…

Excel“牛人”变现方案参考

有几种方式可以通过Excel技能实现变现&#xff1a; 1. 提供Excel咨询和培训服务&#xff1a;如果你对Excel非常熟悉&#xff0c;你可以提供咨询和培训服务&#xff0c;帮助他人解决Excel使用中的问题或提高他们的Excel技能。 2. 制作和销售Excel模板&#xff1a;你可以根据市…

同步和异步——简单的Demo

一、程序中的同步和异步的区别 在编程中&#xff0c;同步和异步是指代码执行的方式和顺序。 1. 同步&#xff08;Synchronous&#xff09;&#xff1a; 同步代码按照顺序依次执行&#xff0c;每个操作必须等待前一个操作完成后才能执行。在同步模式下&#xff0c;代码会阻塞&…

部署问题集合(十八)Windows环境下使用两个Tomcat

下载Tomcat Tomcat镜像下载地址&#xff1a;https://mirrors.cnnic.cn/apache/tomcat/进入如下地址&#xff1a;zip的是压缩版&#xff0c;exe是安装版 修改第二个Tomcat配置文件 第一步&#xff1a;编辑conf/server.xml文件&#xff0c;修改三个端口&#xff0c;有些版本改…

信号量SytemV与Posix信号量的介绍与用法

目录 1、信号量介绍 2、信号量SystemV介绍 2.1 信号量函数 2.2 信号量C代码实现 3、信号量Posix介绍 3.1 无名信号量 3.2 有名信号量 1、信号量介绍 信号量是一种计数器&#xff0c;用在多进程、多线程的共享资源访问控制上面&#xff0c;防止多进程、多线程对共享资源的…

win下tomcat部署问题积累

1、win下双击tomcat的start.bat出现闪退 检查环境变量是否配置正确&#xff1a; 1.在已解压的tomcat的bin文件夹下找到startup.bat&#xff0c;右击->编辑。在文件头加入下面两行&#xff1a; SET JAVA_HOMED:\Java\jdk1.6.0_10 &#xff08;java jdk目录&#xff09;S…

【C语言进阶】程序环境和预处理

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;C语言 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、程序的翻译环境和执行环境 二、详解编译和链接 2.1翻译环境 2.2编译的过…

Centos yum install出现Error: Unable to find a match: epel-release的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

MySQL基础扎实——MySQL中有哪几种锁

常见锁举例 在MySQL中&#xff0c;常见的锁包括以下几种&#xff1a; 表级锁&#xff08;Table-level Lock&#xff09;&#xff1a;表级锁是对整张表进行锁定&#xff0c;可以分为两种类型&#xff1a; 共享锁&#xff08;Shared Lock&#xff09;&#xff1a;也称为读锁&…

Google Earth Engine谷歌地球引擎提取多波段长期反射率数据后绘制折线图并导出为Excel

本文介绍在谷歌地球引擎GEE中&#xff0c;提取多年遥感影像多个不同波段的反射率数据&#xff0c;在GEE内绘制各波段的长时间序列走势曲线图&#xff0c;并将各波段的反射率数据与其对应的成像日期一起导出为.csv文件的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engi…

Python图像处理【13】使用PIL执行图像降噪

使用PIL执行图像降噪 0. 前言1. 均值滤波器1.1 均值滤波器原理1.2 使用均值滤波器去除椒盐噪声 2. 高斯滤波器2.1 高斯滤波器原理2.2 使用高斯模糊滤波器去除椒盐噪声 3. 中值滤波器3.1 中值滤波器原理3.2 使用中值滤波器去除椒盐噪声 小结系列链接 0. 前言 在本节中&#xff…

MAXENT模型的生物多样性教程

详情点击链接&#xff1a;基于MAXENT模型的生物多样性生境模拟与保护优先区甄选、自然保护区布局优化及未来气候变化下评估中的应用及论文写作 一&#xff1a;生物多样性保护格局与自然保护区格局优化 1.我国生物多样性格局与分布&#xff1b; 2.我国自然保护区格局与分布&…