#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define True 1
// 定义二叉树的节点类型
typedef struct BiTNode{
char data;
struct BiTNode *lchild; // 定义节点的左孩子指针,有孩子指针
struct BiTNode *rchild;
}BiTNode,*BiTree; //先序遍历构造二叉链表表示对二叉树T int CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
fflush(stdin); // 对键盘缓冲区的处理
if(ch=='#'){ //如果输入#,创建空节点
T=NULL;
}else{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))){ //申请根节点的空间
printf("申请节点空间失败!!");
exit(OVERFLOW);
}else{
T->data=ch; //生成根节点
CreateBiTree(T->lchild); //构建左子树
CreateBiTree(T->rchild); //构建右子树
}
return OK;
}
return ERROR;
}
//先序遍历二叉树
int DLR(BiTree T)
{ if(T!=NULL) // 如果树不为空
{
printf("%c\n",T->data);
DLR(T->lchild); // 递归遍历
DLR(T->rchild);
}else{
return ERROR; //树为空
}
return OK; // 遍历成功
} //中序遍历二叉树
int LDR(BiTree T)
{ if(T!=NULL)
{
LDR(T->lchild); // 递归遍历
printf("%c\n",T->data);
LDR(T->rchild);
}else{
return ERROR; //树为空
}
return OK; // 遍历成功
} //后序遍历二叉树
int LRD(BiTree T)
{
if(T!=NULL)
{
LRD(T->lchild); // 递归遍历
LRD(T->rchild);
printf("%c\n",T->data);
}else{
return ERROR; //树为空
}
return OK; // 遍历成功
}
// 树的叶子数
void yezi(BiTree T){ if(T!=NULL){
if(!T->lchild&&!T->rchild){ printf("%c\n",T->data); // 打印叶子节点
}
yezi(T->lchild);
yezi(T->rchild);
} }
// 树的深度
int shendu(BiTree T){
int h=,h1,h2;
if(T==NULL)
return h;
else{
h1=shendu(T->lchild);
h2=shendu(T->rchild);
if(h1>=h2) // 最后加的数为树的最深
h=h1+;
else
h=h2+;
}
return h;
} void OperateMenu()
{ printf("\n--------------请选择元素处理方式---------\n\n");
printf("\n注:请输入数字\n");
printf("0>:退出操作\n");
printf("1>:先序遍历二叉树\n");
printf("2>:中序遍历二叉树\n");
printf("3>:后序遍历二叉树\n");
printf("4>:树的叶子节点\n");
printf("5>:树的深度\n");
printf("请选择对元素的处理:"); } void zushi(){
printf("注:此过程为二叉树的建立及其对其的相关操作\n\t以下为树的大致模型\t\n"); printf(" 1 \n");
printf(" / \\ \n");
printf(" 2 3 \n");
printf(" / \\ / \\ \n");
printf(" # # # # \n");
printf("\n 注!!!楼上输入 # 表示无孩子为空\n故输入序列为12##3###\n");
printf("实际形成序列形成的树为为:\n");
printf(" 1 \n");
printf(" / \\ \n");
printf(" 2 3 \n");
}
int main(){
int w=,k,n,boo=;
BiTree T;
printf("请用户选择创建二叉树或退出程序:\n\n");
printf("创建二叉树请输入:'1'\n\n");
printf("退出请选择'0'或 其它!!\n\n");
printf("请选择:");
scanf("%d",&w);
if(w==){
zushi();
printf("\n请输入树节点元素(请回车输入下一个数):\n");
fflush(stdin);
boo=CreateBiTree(T);
if(!boo){
//printf("\n构建成功!!\n");
while(!boo){
printf("\n构建树为空树,请重新构建:");
printf("\n请输入树节点元素(请回车输入下一个数):\n");
boo=CreateBiTree(T);
}
}else{
printf("\n构建成功!!\n");
} OperateMenu();
scanf("%d",&k);
while(k){
switch(k){
case :break;
case :
printf("先序遍历结果为:\n");
boo=DLR(T);
if(boo)
printf("\n先序遍历成功!!\n");
else
printf("\n先序遍历失败!!\n");
break;
case :
printf("中序遍历结果为:\n");
boo=LDR(T);
if(boo)
printf("\n中序遍历成功!!\n");
else
printf("\n中序遍历失败!!\n");
break;
case :
printf("后序遍历结果为:\n");
boo=LRD(T);
if(boo)
printf("\n后序遍历成功!!\n");
else
printf("\n后序遍历失败!!\n");
break;
case :
printf("其中是叶子节点的是:\n");
yezi(T);
break;
case :n=shendu(T);
printf("树的深度为:%d",n);
break; }
OperateMenu();
scanf("%d",&k);
} }
return OK;
}

c_数据结构_二叉树的遍历实现的更多相关文章

  1. 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  2. 【PHP数据结构】二叉树的遍历及逻辑操作

    上篇文章我们讲了许多理论方面的知识,虽说很枯燥,但那些都是我们今天学习的前提,一会看代码的时候你就会发现这些理论知识是多么地重要了.首先,我们还是要说明一下,我们学习的主要内容是二叉树,因为二叉树是最 ...

  3. 【数据结构】二叉树的遍历(前、中、后序及层次遍历)及leetcode107题python实现

    文章目录 二叉树及遍历 二叉树概念 二叉树的遍历及python实现 二叉树的遍历 python实现 leetcode107题python实现 题目描述 python实现 二叉树及遍历 二叉树概念 二叉 ...

  4. C_数据结构_链式二叉树

    # include <stdio.h> # include <malloc.h> struct BTNode { int data; struct BTNode * pLchi ...

  5. c_数据结构_图_邻接表

    课程设计------邻接表 图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip #include<stdio.h> ...

  6. python数据结构之二叉树的遍历实例

    遍历方案   从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作:   1).访问结点本身(N)   2).遍历该结点的 ...

  7. C_数据结构_链表的链式实现

    传统的链表不能实现数据和链表的分离,一旦数据改变则链表就不能用了,就要重新开发. 如上说示:外层是Teacher,里面小的是node. #ifndef _MYLINKLIST_H_ #define _ ...

  8. C_数据结构_循环队列

    # include <stdio.h> # include <malloc.h> typedef struct Queue { int * pBase; int front; ...

  9. C_数据结构_栈

    # include <stdio.h> # include <malloc.h> # include <stdlib.h> typedef struct Node ...

随机推荐

  1. 监控数据库SqlServer

    监控数据库的连接数select COUNT( * ) from master.dbo.sysprocesses select COUNT( * ) from master.dbo.sysprocess ...

  2. python--hmac

    检测一下客户端是否合法,不依靠登录认证.这样即使知道服务端ip和端口,客户端也不能随便就连接服务端实现机制是在服务端中设置了密钥,借用了hmac os 两个模块 import socket impor ...

  3. kali环境配置

    1.配置源及刷新软件列表 建议用官方默认源: # vi /etc/apt/sources.list deb http://http.kali.org/kali kali-rolling main no ...

  4. 搭建一个node.js项目

    初始化项目 新建一个文件夹,运行 npm init 初始化项目 mkdir okadaGo cd okadaGo npm init 按照提示输入一些项目的相关信息 D:\web\node>mkd ...

  5. Oracle之视图联合查询加排序问题

    在公司修改bug,有这样的需求:需要从两张视图中查出相同字段的数据,按照导师姓名先排序,再按照学号排序 union联合两张表,SELECT * from((SELECT DS_ID,PYLX_ID,Y ...

  6. Spring接收数据,传递数据

    Spring接收数据,传递数据 前提配置 POM   <dependency> <groupId>org.springframework</groupId> < ...

  7. 错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算

    问题描述:错误 175: 具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序未在计算 原因描述:一.首先我的系统是因为是win10 的有问题,重新装了系统. 二. ...

  8. vue 学习三 v-model 表单绑定输入 以及修饰符的用处

    v-model 指定使用过vue的同学都应该是很熟悉的了,这里就不多介绍,本章主要就是记录一些v-model非常实用的修饰符和对于v-model在html文本框,多行文本框,选择框,单选框,复选框上对 ...

  9. 依赖背包变形(经典)——poj1155

    这个题用优化后的依赖背包做难以实现,所以用常规的泛化物品的和来做即可 每个节点的容量定义为这个节点下的叶子结点个数,dp[u][j]用来表示节点u下选取j个物品的最大收益,最后从m-0查询dp[1][ ...

  10. 树上莫比乌斯反演+分层图并查集——cf990G

    /* 树上莫比乌斯反演 求树上 满足 d|gcd(au,av) gcd(au,av)的对数f(d) 如何求: 建立200000层新图,即对于每个数建立一个新图 在加边时,给gcd(au,av)的约数层 ...