【数据结构】二叉树的建立及先中后序遍历完整C语言代码

简介: 【数据结构】二叉树的建立及先中后序遍历完整C语言代码

二叉树的先中后序遍历

二叉树的建立


我们知道,建立一个二叉树,可以写出它的先序遍历,后序遍历,中序遍历。本文根据先序序列建立一个二叉树,以字符#表示空结点。先序序列的二叉树如下图所示。(ABD##E##CF###)

比如我们知道这样的一个二叉树

想要建立这个二叉树二叉树,我们就要依次从键盘输入 ABD##E##CF###。

这样,我们就建立好了一个二叉树,接下来就是输出该二叉树,分别通过先序遍历,中序遍历,后序遍历输出该二叉树。


先序遍历


//先序遍历
void Preorder(Bintree *bt)
{
   if (*bt != NULL)
   {
       printf("%c", ((*bt)->data));
       Preorder(&(*bt)->lchild);//先序遍历左子树
       Preorder(&(*bt)->rchild);//先序遍历右子树
   }
}

中序遍历


//中序遍历
void Inorder(Bintree *bt)
{
    if (*bt != NULL)
  {
        Inorder(&(*bt)->lchild);//中序遍历左子树
        printf("%c", (*bt)->data);
        Inorder(&(*bt)->rchild);//中序遍历右子树
    }
}

后序遍历


//后序遍历
void Posorder(Bintree *bt)
{
      if (*bt != NULL)
    {
          Posorder(&(*bt)->lchild);//后序遍历左子树
          Posorder(&(*bt)->rchild);//后序遍历右子树
          printf("%c", (*bt)->data);
      }
}

来看完整代码

#include <stdio.h>
#include <stdlib.h> 
typedef struct Binnode//结构定义
{
    char data;//数据域
    struct Binnode *lchild;//左孩子
    struct Binnode *rchild;//右孩子
}Binnode, *Bintree;
//创建二叉树
void Create_Bintree(Bintree *bt)
{
     char ch; 
     if((ch = getchar()) == '#') 
   {
    *bt = NULL;//空子树
     } 
   else 
   {
         *bt = (Binnode *)malloc(sizeof(Binnode));//开辟空间
         (*bt)->data = ch;
         Create_Bintree(&(*bt)->lchild);//创建左子树
         Create_Bintree(&(*bt)->rchild);//创建右子树
     }
}
//先序遍历
void Preorder(Bintree *bt)
{
   if (*bt != NULL)
   {
       printf("%c", ((*bt)->data));
       Preorder(&(*bt)->lchild);//先序遍历左子树
       Preorder(&(*bt)->rchild);//先序遍历右子树
   }
}
//中序遍历
void Inorder(Bintree *bt)
{
    if (*bt != NULL)
  {
        Inorder(&(*bt)->lchild);//中序遍历左子树
        printf("%c", (*bt)->data);
        Inorder(&(*bt)->rchild);//中序遍历右子树
    }
}
//后序遍历
void Posorder(Bintree *bt)
{
      if (*bt != NULL)
    {
          Posorder(&(*bt)->lchild);//后序遍历左子树
          Posorder(&(*bt)->rchild);//后序遍历右子树
          printf("%c", (*bt)->data);
      }
}
void main()
{
      Bintree T;
    printf("请输入一个二叉树:\n");
      Create_Bintree(&T);
    printf("Tree Create OK!\n");
    printf("先序遍历:\n");
      Preorder(&T);
    printf("\n中序遍历:\n");
      Inorder(&T);
    printf("\n后序遍历:\n");
      Posorder(&T);
    printf("\n");
 }

程序结果


目录
相关文章
|
17天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
16天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
58 16
|
16天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
65 8
|
18天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
38 0
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
机器学习/深度学习 人工智能 固态存储
C语言决赛代码
#include #include #include struct book { int num; char bname[50]; char wname[20]; char press[50]; char sort[50]; int time; float p...
853 0
|
8天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
25 6
|
28天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
35 10
|
22天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
27天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
54 7