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

二叉树遍历

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

二叉树的基本定义

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

1、前序遍历

前序遍历是先访问根节点,然后按照左子树、右子树的顺序递归遍历。前序遍历的访问顺序为"根左右 "。

代码

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

2、中序遍历

中序遍历是先按照左子树的顺序递归遍历,然后访问根节点,最后按照右子树的顺序递归遍历。中序遍历的访问顺序为"左根右 "。

代码

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

3、后序遍历

后序遍历是先按照左子树、右子树的顺序递归遍历,然后访问根节点。后序遍历的访问顺序为"左右根 "。

代码

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

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

①tree.h

c 复制代码
#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

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

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
求先序?

相关推荐
肆悟先生7 分钟前
3.16 含有可变参数的函数
c++·算法
步步为营DotNet12 分钟前
深度解析.NET中属性(Property)的幕后机制:优化数据访问与封装
java·算法·.net
Swift社区12 分钟前
LeetCode 454 - 四数相加 II
java·算法·leetcode
tokepson15 分钟前
反向传播
深度学习·算法·ai·反向传播
Xの哲學22 分钟前
Linux AQM 深度剖析: 拥塞控制
linux·服务器·算法·架构·边缘计算
艾醒25 分钟前
大模型原理剖析——突破LLM效率瓶颈:多标记预测(MTP)技术深度解析与实战
算法
智驱力人工智能26 分钟前
森林防火无人机火焰监测系统 构建“天空地”一体化智能防火体系 无人机火焰检测,支持红色火焰检测 城市高层建筑无人机火焰识别
人工智能·深度学习·opencv·算法·目标检测·无人机·边缘计算
多米Domi01126 分钟前
0x3f第12天 0-1背包
python·算法·leetcode·动态规划
Bruce_kaizy32 分钟前
c++图论————最短路之Floyd&Dijkstra算法
c++·算法·图论
黎雁·泠崖39 分钟前
指针收官篇:sizeof/strlen + 指针运算笔试考点全梳理
c语言·开发语言