二叉树基本操作演示程序C语言编写

这篇具有很好参考价值的文章主要介绍了二叉树基本操作演示程序C语言编写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述:设计一个与二叉树基本操作相关的演示程序

要求:开发工具Dev C++   c语言编写

1.创建二叉树。

2.将创建的二叉树,以树状形式输出。

3.分别以先序、中序、后序三种遍历方式访问二叉树。

4.输出二叉树中的叶子结点以及叶子结点的个数。

5.输出二叉树的高度。

代码如下

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#define MAXLEN 100
#define NLAYER 4
typedef char DataType;
 
typedef struct Node {
    //定义二叉树结点
    DataType data;
    struct Node* leftChild;
    struct Node* rightChild;
}BiTreeNode, * BiTree;
 

//输    入:ABD#G##EH###CF##IK###   (#表示 孩子为空) 
BiTree CreatePreTree();  //建立二叉树
int Count1(BiTree bt);//二叉树的叶子节点的数量
int Treehigh(BiTree bt);//二叉树的高度 

void TranslevelPrint(BiTree bt);//树形打印二叉树
void PreOrder(BiTreeNode* root, void visit(DataType item));//前序遍历
void InOrder(BiTreeNode* root, void visit(DataType item));//中序遍历
void PostOrder(BiTreeNode* root, void visit(DataType item));//后序遍历
void visit(DataType item);//访问函数
void Destory(BiTree bt); //释放空间
 
int main()
{
    BiTree T;
    char sel = ' ';
    while (sel != '0')
    {
        printf("------二叉树演示系统-------\n");
        printf("------------------------------------------\n");
        printf("       1.创建二叉树\n");
        printf("       2.树的形状为\n");
        printf("       3.先序排列操作\n");
        printf("       4.中序排列操作\n");
        printf("       5.后序排列操作\n");
        printf("       6.输出二叉树的叶子结点以及数量\n");
        printf("       7.输出二叉树的高度\n");
        printf("       0.退出系统\n");
        printf("请输入选项[0-9]:");
        sel = _getch();
        switch (sel)
        {
             
        case '1':
            
            printf("创建二叉树,按照以下规则创建二叉树 按照前序遍历来创建二叉树 #表示 孩子为空.\n");
            T = CreatePreTree();
            system("pause");
            break;
        case '2':printf("树的形状为:\n"); TranslevelPrint(T);getch();
            break;
        case '3':
            system("cls"); 
            printf("先序排列操作.\n");
            printf("前序遍历:");
            PreOrder(T, visit);//前序遍历
            system("pause");
            break;
        case '4':
            system("cls"); 
            printf("中序排列操作.\n");
            printf("\n中序遍历:");
            InOrder(T, visit);//中序遍历
            system("pause");
            break;
        case '5':
            system("cls"); 
            printf("后序排列操作.\n");
            printf("\n后序遍历:");
            PostOrder(T, visit);//后序遍历
            system("pause");
            break;
        case '6':
            system("cls"); 
            printf("输出二叉树的叶子节点以及数量.\n");
            printf("叶子节点为: \n"); 
            printf("  叶子节点:%d个  \n", Count1(T));
            system("pause");
            break;
        case '7':
            system("cls"); 
            printf("输出二叉树的高度.\n");
            printf("二叉树的高度为:%d\n", Treehigh(T));
            system("pause");
            break;

        case '0':
            system("cls"); 
            printf("\n谢谢使用,再见!\n");
            break;
        default:
            printf("您输入的选项不合法,请重新选择!\n");
        }
    }
    return 0;
}
void visit(DataType item)
{
    printf("%c ", item);
}
 
BiTree CreatePreTree()//建立二叉树 
{
    char c;
    scanf("%c", &c);
    if (c == '#')  //空格 
        return NULL;
    else
    {
        BiTree T = (BiTree)malloc(sizeof(BiTreeNode));
        T->data = c;
        T->leftChild = CreatePreTree();
        T->rightChild = CreatePreTree();
        return T;
    }
}
void TranslevelPrint(BiTree bt)
 {
     //本算法实现二叉树的按层打印
     struct node
     {
         /* data */
         BiTree vec[MAXLEN];//存放树结点
         int layer[MAXLEN];//结点所在的层
          int locate[MAXLEN];//打印结点的位置
         int front,rear;
     }q;  //定义队列q
     int i,j=1,k=0,nlocate;
      q.front=0;    q.rear=0;//初始化队列q队头,队尾
     printf("  ");
    q.vec[q.rear]=bt;//将二叉树根节点入队列
    q.layer[q.rear]=1;
     q.locate[q.rear]=20;
     q.rear=q.rear+1;
     while(q.front<q.rear)
     {
        bt=q.vec[q.front];
         i=q.layer[q.front];
        nlocate=q.locate[q.front];
         if (j<i)   //进层打印时换行
          {
              printf("\n\n");
              j=j+1; k=0;
              while(k<nlocate)
              {
                  printf("  ");
                  k++;
              }
          }
          while(k<(nlocate-1))
          {
              printf("  ");
              k++;
          }
          printf("%c",bt->data );
       q.front=q.front+1;
         if(bt->leftChild !=NULL)//存在左子树,将左子树根节点入队列
          {             q.vec[q.rear]=bt->leftChild;
              q.layer[q.rear]=i+1;
              q.locate[q.rear]=(int)(nlocate-pow(2,NLAYER-i-1));
              q.rear=q.rear+1;
          }
          if(bt->rightChild !=NULL)
          {
              q.vec[q.rear]=bt->rightChild;
              q.layer[q.rear]=i+1;
              q.locate[q.rear]=(int)(nlocate+pow(2,NLAYER-i-1));
              q.rear=q.rear+1;
          }
      }
  }
void PreOrder(BiTreeNode* root, void visit(DataType item)) {
    //前序遍历二叉树root,访问操作为visit
    if (root != NULL)
    {
        visit(root->data);
        PreOrder(root->leftChild, visit);
        PreOrder(root->rightChild, visit);
    }
}
void InOrder(BiTreeNode* root, void visit(DataType item)) {
    //中序遍历二叉树root,访问操作为visit
    if (root != NULL)
    {
        InOrder(root->leftChild, visit);
        visit(root->data);
        InOrder(root->rightChild, visit);
    }
}
 
void PostOrder(BiTreeNode* root, void visit(DataType item)) {
    //后序遍历二叉树root,访问操作为visit
    if (root != NULL)
    {
        PostOrder(root->leftChild, visit);
        PostOrder(root->rightChild, visit);
        visit(root->data);
    }
}
 

 
 
int Count1(BiTree bt)   //求叶子节点的数量 并输出叶子节点 
{
    if (bt == NULL) return 0;
    else if (bt->leftChild == NULL && bt->rightChild == NULL)
    { 
    
        printf("%c ",bt->data);
        return 1;
    } 
    else
        return (Count1(bt->leftChild) + Count1(bt->rightChild));
}

 
int Treehigh(BiTree bt)   //求二叉树的高度 
{
    int lefthigh, righthigh, high;
    if (bt == NULL)  high = 0;//空树
    else
    {
        lefthigh = Treehigh(bt->leftChild);
        righthigh = Treehigh(bt->rightChild);
        int i = lefthigh > righthigh ? lefthigh : righthigh;//找到子树的高度
        high = i + 1;//子树高度+1=树的高度
    }
    return high;
}
 二叉树基本操作演示程序C语言编写
 二叉树基本操作演示程序C语言编写

二叉树基本操作演示程序C语言编写

 二叉树基本操作演示程序C语言编写

二叉树基本操作演示程序C语言编写

二叉树基本操作演示程序C语言编写

二叉树基本操作演示程序C语言编写

二叉树基本操作演示程序C语言编写

二叉树基本操作演示程序C语言编写

当我们输入其他数字的时候就会出现

二叉树基本操作演示程序C语言编写

结束

二叉树基本操作演示程序C语言编写文章来源地址https://www.toymoban.com/news/detail-476812.html

到了这里,关于二叉树基本操作演示程序C语言编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构第十四弹---链式二叉树基本操作(下)

    如何翻转一颗二叉树?首先我们可以先观察一下翻转前后的变化。如下图。 画图分析 通过观察,可以发现:翻转后,根的左右子树的位置交换了;根的孩子的左右子树的位置也交换了;根的孩子的孩子的左右子树的位置也交换了… 思路: 1、翻转左子树 2、翻转右子树 3、交

    2024年01月20日
    浏览(40)
  • 【FPGA基础入门实践】Verilog 基本项目操作逐步演示

    0x00 回顾:AND/OR/NOT 逻辑的特性 AND: 与门可以具有两个或更多的输入,并返回一个输出。当所有输入值都为 1 时,输出值为 1。如果输入值中有任何一个为 0,则输出值为 0。 OR: 或门可以具有两个或更多的输入,并返回一个输出。如果输入值中至少有一个为 1,则输出值为

    2024年02月12日
    浏览(38)
  • 【数据结构】链表C语言编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点

    这段代码是用C语言编写的,它定义了一个链表,并实现了一些基本的链表操作,如创建新节点、插入节点、清空链表、输出链表以及查找节点。以下是每段代码的详细解释: 文件注释: 这段代码是一个文件注释 包含头文件: #include stdio.h  和  #include stdlib.h :这两个头文件

    2024年02月09日
    浏览(46)
  • 探索 Linux vim/vi 编辑器:介绍、模式以及基本操作演示

    💐作者:insist-- 💐个人主页: insist-- 的个人主页 理想主义的花,最终会盛开在浪漫主义的土壤里,我们的热情永远不会熄灭,在现实平凡中,我们终将上岸,阳光万里 ❤️欢迎点赞👍收藏📁评论📒 前言 本文将介绍vim / vi编辑器是什么并详细讲解它的三种工作模式以及基

    2024年02月05日
    浏览(66)
  • 头歌 二叉树的二叉链表存储及基本操作

    第1关 先序遍历创建二叉链表存储的二叉树及遍历操作   第2关 计算二叉树的高度、总节点个数和叶子节点个数   第3关 层次遍历二叉树   第4关 递归实现二叉树左右子树交换   第5关 非递归实现二叉树左右子树交换   第6关 非递归实现二叉树的中序遍历

    2024年02月03日
    浏览(30)
  • 二叉树的基本操作(共21个)

    先看几条定义: 1、 二叉树 是一种每个结点最多只能有两个孩子的树。 2、每一个子集本身又是一棵符合定义的树,叫做根节点的 子树 。 3、每一棵子树的根叫做根 r 的 孩子 ,而 r 是每一棵子树的根的 双亲。 4、具有相同双亲的结点称为 兄弟 。 5、树中结点所在的最大层次

    2023年04月20日
    浏览(32)
  • 二叉树的顺序存储及基本操作

    1、在树中除根结点外,其余结点分成m(m≥0)个(A)的集合T1,T2,T3…Tm,每个集合又都是树,此时结点T称为Ti的父结点,Ti称为T的子结点(1≤i≤m)。 A、互不相交B、可以相交C、叶节点可以相交D、树枝结点可以相交 2、在一棵度为3的树中,度为3的结点数为2个,度为2的结点

    2024年02月06日
    浏览(50)
  • 【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 ⭐树 🏳️‍🌈定义  🏳️‍🌈注意 🍔树的基本术语 ⭐二叉树 🏳️‍🌈定义 🎆二叉树和树的区别 🏳️‍🌈二叉树

    2024年02月05日
    浏览(70)
  • 数据结构实验4:二叉树的基本操作

    一、问题描述 运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制已有的二叉树、计算已有的二叉树的深度、先根序序列、中根序序列、后根序序列等。 输入格式:AB#C##D## 二、实验目的 掌握二叉链表及二叉树的基本操作。 三、实验内容及要求 1、构造

    2024年01月23日
    浏览(42)
  • 吐血整理 二叉树(链表实现)的基本操作详解!

    本文是对二叉树这种数据结构基本操作与部分练习题的总结,内容庞大、详细、易懂,是你学习路上不容错过的优质博客! 既然是 链式二叉树 ,那必须得有自己的结点类型,以下是链式二叉树结点类型的定义,为了避免过多重复的代码,下面的问题都统一使用该结点类型。

    2024年02月03日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包