二叉树作为数据结构其实是一个挺有意思的结构,可以有多种应用
我们直接来看一下二叉树的代码:

#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>#define maxsize 100//二叉树的基本操作:建立,前序,中序,后序,层次,求叶子数,求层数,求结点树
//二叉树的数据结构
//创建数据域和左右指针域
typedef struct Tree
{char data;struct tree* lchild;struct tree* rchild;
}tree;//建立二叉数初始化
void inittree(tree* root)
{root->data = "";root->rchild = NULL;root->lchild = NULL;
}//二叉数的创建
tree* create(tree* root)
{char value;scanf_s("%c", &value);if (value == '#'){root = NULL;}else{root = (tree*)malloc(sizeof(tree));root->data = value;root->lchild = create(root->lchild);root->rchild = create(root->rchild);}return root;
}//创建二叉树的结点(二级指针写法)
void createnode(tree** node)
{char p_data;scanf_s("%c", &p_data);if (p_data == '#'){*node = NULL;}else{*node = (tree*)malloc(sizeof(tree));(*node)->data = p_data;createnode(&((*node)->lchild));createnode(&((*node)->rchild));}
}//判断二叉树是否为空
int tempty(tree* root)
{if (root->data == ""){printf("二叉树为空\n");return 0;}else{printf("二叉树不为空\n");return 1;}
}//先序遍历(递归)
void porder(tree* root)
{if (root != NULL){printf("%c\t", root->data);porder(root->lchild);porder(root->rchild);}
}//中序遍历(递归)
void morder(tree* root)
{if (root != NULL){morder(root->lchild);printf("%c\t", root->data);morder(root->rchild);}
}//后序遍历(递归)
void torder(tree* root)
{if (root != NULL){torder(root->lchild);torder(root->rchild);printf("%c\t", root->data);}
}//先序遍历非递归
//访问左子树的结点存入栈中(继续深入)直到无法访问再让其出栈回退访问右子树
void p_order(tree* root)
{if (root == NULL){return;}tree* box[10];//创建栈存储每次打印结点的位置int box_top = -1;//栈顶的标记,为和数组下标保持一致tree* move = root;//从根节点开始打印while (box_top != -1 || move){while (move){//把路径入栈并且打印结点printf("%c\t", move->data);box[++box_top] = move;//把结点存入数组中move = move->lchild;//移动到存入结点的左子树}if (box_top != -1)//判断如果访问完左子树{move = box[box_top];//获取栈顶元素box_top--;//回溯move = move->rchild;//移动访问右子树}}
}//中序遍历非递归
//持续深入左子树并且存储结点直到无法深入然后回溯并且打印,出栈再访问右子树
void m_order(tree* root)
{tree* box[10];//创建栈,用于存放结点的位置int box_top = -1;//定义栈顶的标记tree* move = root;//定义移动的指针while (box_top != -1 || move){//深入访问左子树while (move){box[++box_top] = move;move = move->lchild;}if (box_top != -1){move = box[box_top--];//获取栈顶元素且回溯printf("%c\t", move->data);move = move->rchild;//移动到右子树}}
}//后序遍历非递归
//先访问左子树一直深入直到无法访问,打印结点然后回溯,再访问右子树,在打印回溯,会出现两个树根
//定义访问标记如果访问过就不再打印来解决回溯后多次打印的问题
void t_order(tree* root)
{if (root == NULL){return;}tree* box[10];int box_top = -1;tree* move = root;tree* visit = NULL;//访问标记while (move){box[++box_top] = move;move = move->lchild;}while (box_top != -1){move = box[box_top--];if (move->rchild == NULL || move->rchild == visit)//判断当前结点的右子树是否被访问{printf("%c\t", move->data);visit = move;//改变标记的位置就是回溯到上一层的树根}else{box[++box_top] = move;move = move->rchild;while (move){box[++box_top] = move;move = move->lchild;}}}}//二叉树求叶子数
int leaves(tree* root)
{if (root == NULL){return 0;}else if (root->lchild == NULL && root->rchild == NULL){return 1;}else{return leaves(root->lchild) + leaves(root->rchild);}
}//求树深度的递归算法
int deep(tree* root)
{int lnum, rnum;if (root == NULL){return 0;}else{lnum = deep(root->lchild);rnum = deep(root->rchild);return (lnum > rnum ? lnum : rnum) + 1;}
}//求二叉树中以某值为根的子树深度(递归)
void x_deep(tree* root , char x)
{int lnum = 0, rnum = 0;if (root == NULL){printf("空树深度为0\n");}if (root->data == x){printf("%d\n", deep(root));}else{if (root->lchild){x_deep(root->lchild, x);}if (root->rchild){x_deep(root->rchild, x);}}
}//二叉树求指定结点的层数
int floor(tree* root, char x)
{int lnum, rnum, fnum;if (root == NULL){fnum = 0;}else if (root->data == x){fnum = 1;}else{lnum = floor(root->lchild, x);rnum = floor(root->rchild, x);if (lnum == 0 && rnum == 0)//查找失败{/*printf("查找结束\n");*/fnum = 0;}else{fnum = ((lnum > rnum) ? lnum : rnum) + 1;}}return fnum;
}//统计数中结点个数
int nodenum(tree* root)
{if (root == NULL){return 0;}else{return(nodenum(root->lchild) + nodenum(root->rchild)) + 1;}
}//层序遍历BFS
//准备工作:构造队列
typedef struct queue
{tree* qdata[maxsize];int front;int rear;
}q;//对队列进行初始化
void initqueue(q* node)
{node->front = node->rear = 0;
}//判断队列是否为空
void empty(q* node)
{if (node->front == node->rear){printf("队列为空");}
}//入队
void push(q* node, tree* root)
{node->qdata[node->rear] = root;node->rear++;
}//出队
tree* pop(q* node, tree* root)
{return node->qdata[(++node->front) - 1];
}//二叉树层次遍历BFS
void BFS(tree* root)
{q* node;node = (q*)malloc(sizeof(q));initqueue(node);if (root != NULL){push(node, root);}while (node->front != node->rear){tree* root1 = (tree*)malloc(sizeof(tree));root1 = pop(node, root1);printf("%c\t", root1->data);if (root1->lchild != NULL){push(node, root1->lchild);}if (root1->rchild != NULL){push(node, root1->rchild);}}
}int main()
{//测试:12#46###3#5##,ABC##DE#G##F###tree* root = (tree*)malloc(sizeof(tree));inittree(root);printf("请按先序遍历的次序输入二叉树:\n");root = create(root);int temp;while (1){printf("*****************************二叉树综合实验****************************\n");printf("*****************************1.二叉树先序遍历**************************\n");printf("*****************************2.二叉树中序遍历**************************\n");printf("*****************************3.二叉树后序遍历**************************\n");printf("*****************************4.二叉树先序遍历(非递归)****************\n");printf("*****************************5.二叉树先序遍历(非递归)****************\n");printf("*****************************6.二叉树先序遍历(非递归)****************\n");printf("*****************************7.二叉树层次遍历(BFS)*******************\n");printf("*****************************8.求二叉树深度(递归)********************\n");printf("*****************************9.二叉树求叶子数**************************\n");printf("*****************************10.二叉树求结点数*************************\n");printf("*****************************11.二叉树求指定结点所在的层数*************\n");printf("*****************************12.判断二叉树是否为空树*******************\n");printf("*****************************13.求二叉树中以某值为根的子树深度(递归)*\n");printf("*****************************14.退出exit*******************************\n");printf("***********************************************************************\n");printf("输入你的选项:");scanf_s("%d", &temp);if (temp == 14){printf("程序退出》》》");break;}switch (temp){case 1:printf("二叉树前序遍历(递归)为:\n");porder(root);printf("\n");break;case 2:printf("二叉树中序遍历(递归)为:\n");morder(root);printf("\n");break;case 3:printf("二叉树后序遍历(递归)为:\n");torder(root);printf("\n");break;case 4:printf("二叉树前序遍历为:\n");p_order(root);printf("\n");break;case 5:printf("二叉树中序遍历为:\n");m_order(root);printf("\n");break;case 6:printf("二叉树后序遍历为:\n");t_order(root);printf("\n");break;case 7:printf("BFS层序遍历二叉树:\n");BFS(root);printf("\n");break;case 8:printf("二叉树的深度为%d层\n", deep(root));break;case 9:printf("二叉树中含有%d个叶子结点\n", leaves(root));break;case 10:printf("二叉树共有%d个结点\n", nodenum(root));break;case 11:{char x;printf("请输入你要查找的结点:");scanf_s(" %c", &x);//注意:一定要在%c前加个blank,让缓冲区置空!printf("当前结点所在的层数为:%d\n", floor(root, x));}break;case 12:tempty(root);printf("\n");break;case 13:{char x2;printf("请输入你要查找的结点:");scanf_s(" %c", &x2);printf("以%c为子树的深度为:",x2);x_deep(root, x2);printf("\n");}break;default:printf("error");break;}}return 0;
}

程序执行结果:






C语言二叉树的基本操作(超全)相关推荐

  1. 树的基本操作代码 c语言,二叉树的基本操作(C语言、源代码)

    二叉树的基本操作(源代码) #include "stdio.h" #include "malloc.h" #define MAX 100 typedef str ...

  2. C语言十大操作符超全详解【建议收藏】

    C语言操作符操作符繁多但一共可以大致分为10大类 文章目录 C语言操作符操作符繁多但一共可以大致分为10大类 一.算术操作符 C语言提供所有常见的算术运算符+, - , * , / , % 二.移位操 ...

  3. 编程入门:C语言基础知识全网超全不用到处找了!

    你背或者不背,干货就在那里,不悲不喜 你学或者不学,编程就在那里,不来不去 听到这话的你是否略感扎心? 01基础知识 计算机系统的主要技术指标与系统配置. 计算机系统.硬件.软件及其相互关系. 微机硬 ...

  4. c语言 异或_编程入门:C语言基础知识全网超全不用到处找了!(文末附清单)

    你背或者不背,干货就在那里,不悲不喜 你学或者不学,编程就在那里,不来不去 听到这话的你是否略感扎心? 01基础知识 1. 计算机系统的主要技术指标与系统配置. 2. 计算机系统.硬件.软件及其相互关 ...

  5. C语言数据结构之树超全详解

    目录 基础知识 二叉树的一些基本概念 树的性质 二叉树的一些基本性质 操作部分 二叉树的存储结构 1.顺序存储结构 2.链式存储结构 3.线索二叉树 前驱与后继 线索二叉树的存储表示 二叉树的遍历 先 ...

  6. C语言优先级表格(超全)

    优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 -- () 圆括号 (表达式)/函数名(形参表) -- . 成员选择(对象) 对象.成员名 -- ...

  7. 2017二级c语言成绩,2017全国计机等级考试二级C语言知识点超全整(打印版).docx

    2017全国计机等级考试二级C语言知识点超全整(打印版) 全国计算机 等级考试 目录 第一部分 公共基础知识 第 1 章 算法与数据结构1 HYPERLINK \l "_TOC_250068 ...

  8. linux命令行开头是sh,shell脚本语言的使用(超全超详细)

    1.shell的概述 shell 是一种脚本语言 脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译) shell 既是应用程序 又 ...

  9. 数据结构实验报告,二叉树的基本操作(C语言)

    数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...

最新文章

  1. sybase备份问题
  2. git部署与基本命令汇总
  3. unity可以用python编写吗_基于python的Cා代码生成器(用于服务并应用于unity),一个,c,为了,并且,Unity...
  4. VMware与KVM全方面对比
  5. 50道 JavaScript 经典面试题汇总篇
  6. 【codevs1287】矩阵乘法
  7. 心得总结:一名优秀的数据分析专家的能力模型
  8. 收藏精美网页设计作品的200佳网站推荐(系列五)
  9. 命名集 —— 绰号昵称篇
  10. 损失函数——交叉熵损失函数(引子)
  11. 《转》解决struts2在(IE,Firefox)下载文件名乱码问题。
  12. ASP.NET2.0缓存(Cache)技术
  13. Java八股文(高阶)背诵版
  14. 实现酒店无线覆盖和无线漫游
  15. A. Diverse Team
  16. 【ceph】ceph-mds journal模块解读
  17. 7、JSON数据和Java对象的相互转换(客户端和服务器对象数据通讯用)
  18. 大数据江湖之即席查询与分析(上篇)--即席查询与分析的前世今生
  19. PHP —— 一份前端开发工程师够用的PHP知识点(持续更新)
  20. aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...

热门文章

  1. 【渝粤题库】陕西师范大学152111公共部门人力资源开发与管理 作业(高起专、专升本)
  2. Python for-else 用法
  3. Go 1.13虽迟但到,goproxy.cn 为中国开发者量身提供模块代理
  4. CSDN社区投诉申请表
  5. 《北京青年》 VS 《正者无敌》
  6. ChatGPT 未来的前景以及发展趋势
  7. SharePoint 2019 新功能展望
  8. 20年会计应届生转行软件测试,拿下8k+offer是如何做的
  9. 2006年11月30日,IT大事,新闻!
  10. 原生JS实现 trim, trimLeft, trimRight