#include<stdio.h>
#include<stdlib.h>
#include<string.h> #define num 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define FALSE 0
#define TRUE 1 typedef int Status;
typedef char DataType; typedef struct node
{
DataType data;
struct node *lchild,*rchild;
}BinTNode,*BinTree; typedef BinTNode* ElemType; #define QueueSize 100
//循环队列的存储结构
typedef struct
{
ElemType *base;
int front,rear;
}SeQueue; Status CreateBiTree(BinTree &bt)
{//按照先序遍历次序递归建立二叉树。
//ABC@@DE@G@@F@@
char ch;
scanf("%c",&ch);
if(ch == '@') bt = NULL;
else
{
bt = (BinTNode*)malloc(sizeof(BinTNode));
bt->data = ch; //生成根结点
CreateBiTree(bt->lchild); //构造左子树
CreateBiTree(bt->rchild); //构造右子树
}
return OK;
} Status Inorder(BinTree bt)
{//二叉树中序遍历非递归算法
BinTNode *stack[num]; //定义栈数组
int top = ; //初始化栈
stack[top] = bt;
do
{
while(NULL!=stack[top])
{//扫描根结点及其所有的左结点并入栈
top = top+;
stack[top] = stack[top-]->lchild;
}
top = top-; //退栈
if(top>=) //判断栈是否为空
{
printf("%c",stack[top]->data); //访问结点
stack[top] = stack[top]->rchild; //扫描右子树
}
}while(top>=);
return OK;
} void PostOrder(BinTree bt)
{//二叉树后序遍历递归算法
if(bt)
{
PostOrder(bt->lchild);
PostOrder(bt->rchild);
printf("%c",bt->data);
} } int Size(BinTree bt)
{//统计二叉树中所有结点的个数
int num1,num2;
if(bt==NULL)
return ;
else if(bt->lchild==NULL && bt->rchild==NULL)
return ;
else
{
num1 = Size(bt->lchild);
num2 = Size(bt->rchild);
return (num1+num2+);
}
} int LeafCount(BinTree bt)
{//叶子结点总数为
int LeafNum;
if(bt==NULL)
LeafNum = ;
else if((bt->lchild==NULL) && (bt->rchild==NULL)) LeafNum = ;
else LeafNum = LeafCount(bt->lchild)+LeafCount(bt->rchild);
//叶子数为左右子树叶子数目之和
return LeafNum;
} int Depth(BinTree bt)
{//统计二叉树深度
int hl,hr,max;
if(bt!=NULL)
{
hl = Depth(bt->lchild); //求左子树的深度
hr = Depth(bt->rchild); //求右子树的深度
max = hl>hr?hl:hr;
return (max+); //返回树的深度
}
else
return ;
} void Exchange(BinTree bt)
{//交换左右二叉树
if(bt == NULL)
return;
BinTNode *temp;
temp = bt->lchild;
bt->lchild = bt->rchild;
bt->rchild = temp;
Exchange(bt->lchild);
Exchange(bt->rchild);
} //构造一个循环队列
Status InitQueue(SeQueue &Q)
{
Q.base = (ElemType *)malloc(QueueSize *sizeof(ElemType));
if(!Q.base) exit();
Q.front = Q.rear = ;
return OK;
}
//插入新的元素为队尾元素
Status EnQueue(SeQueue &Q,ElemType e)
{
if((Q.rear+)%QueueSize==Q.front)
{
printf("Queue overflow");
return ;
}
Q.base[Q.rear] = e;
Q.rear = (Q.rear+)%QueueSize;
return ;
} //删除队头元素
Status DeleteQ(SeQueue &Q,ElemType &e)
{
if(Q.front == Q.rear)
{
printf("Queue enpty");
return ERROR;
}
e = Q.base[Q.front];
Q.front = (Q.front+)%QueueSize;
return OK;
} //判空循环队列
Status IsEmptyQ(SeQueue Q)
{
if(Q.front == Q.rear)
return TRUE;
else
return FALSE;
}
//层次遍历二叉树
void LevelOrderTraversal(BinTree bt)
{
SeQueue Q;
ElemType e;
//若是空树,则直接返回
InitQueue(Q); //创建并初始化队列
if(bt) EnQueue(Q,bt);
while(!IsEmptyQ(Q))
{
DeleteQ(Q,e);
printf("%4c",e->data);
if(e->lchild) EnQueue(Q,e->lchild);
if(e->rchild) EnQueue(Q,e->rchild);
}
} void main()
{
BinTree bt;
int xz = ;
int yz,sd;
while(xz)
{
printf("二叉树的建立及其基本操作\n");
printf("===========================\n");
printf("1,建立二叉树的存储结构\n");
printf("2,二叉树的基本操作\n");
printf("3,交换二叉树的左右\n");
printf("4,二叉树的层次遍历\n");
printf("0退出系统\n");
printf("==========================\n");
printf("请选择:(0~4)\n");
scanf("%d",&xz);
getchar();
switch(xz)
{//输入:ABC@@DE@G@@F@@@输出:CBEGDFA
case :
printf("输入二叉树的先序序列结点值:\n");
CreateBiTree(bt);
printf("二叉树的链式存储结构建立完成\n");
printf("\n");
break;
case :
printf("该二叉树的后序遍历序列是:");
PostOrder(bt);
printf("\n"); //输出CGEFDBA
printf("该二叉树的中序遍历序列是:");
Inorder(bt);
printf("\n"); //输出CBEGDFA
printf("该二叉树的结点的个树是:%d\n",Size(bt));
yz = LeafCount(bt);
printf("叶子结点个数是:%d\n",yz);
sd = Depth(bt);
printf("该二叉树的深度是:%d\n",sd);
printf("\n");
break;
case :
Exchange(bt);
printf("该二叉树已交换左右子树!\n");
printf("\n");
break;
case :
printf("该二叉树的层序遍历序列是:");
LevelOrderTraversal(bt);
printf("\n"); //输出ABCDEFG
case :
break;
//default:printf("请输入正确的选项:(0~4):\n");
// break; }
}
}

<youcengcibianli>的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Visual Studio 项目模板制作(三)

    前面,我们已经制作好了模板,然后放到相应的Template目录就可以在Visual Studio中使用 本篇,我们采用安装VSIX扩展的方式来安装模板,这种方式需要安装Visual Studio SD ...

  2. 使用caffenet微调时的一些总结

    1,比较笨的方法生成图片列表(两类举例)data/myself/train 目录下 find -name cat.\*.jpg |cut -d '/' -f2-3 >train.txtsed - ...

  3. MVC ---- T4(1)

    T4 模板编辑插件:tangibleT4EditorPlusModellingToolsVS2012.msi 下载地址:http://t4-editor.tangible-engineering.co ...

  4. jenkins 插件,下载地址

    http://updates.jenkins-ci.org/download/plugins/ 通常我们需要下载的插件有如下几个:

  5. 转载:RESTful API 设计指南

    http://www.ruanyifeng.com/blog/2014/05/restful_api.html 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板. ...

  6. 浏览器滚动条及其影响 calc()

    1.浏览器滚动条 默认风格各异,推荐一插件  mCustomScrollbar 不考虑兼容也可自定义样式    链接二 2.影响 以垂直方向为例,当内容变化的时候,如果设置的是overflow:aut ...

  7. Phalcon框架数据库读写分离的实现方法

    Phalcon框架和Yaf类似,是一款用C实现的拓展级别的框架,不过其功能实现更加丰富,设计思路基于依赖注入.容器等方式,更符合现代框架思想.本文主要针对Phalcon框架数据库层的读写分离进行说明, ...

  8. 肠道型(enterotype)简介

    An enterotype is a classification of living organisms based on its bacteriological ecosystem in the ...

  9. (GoRails )使用Vue.js制作拖拉list功能(v1-4) gem 'acts_as_list'(自动排列顺序)

    系列视频: use Vue.js to build the drag and drop support for the list themselves the cards that are under ...

  10. poj1651 Multiplication Puzzle

    比较特别的区间dp.小的区间转移大的区间时,也要枚举断点.不过和普通的区间dp比,断点有特殊意义.表示断点是区间最后取走的点.而且一个区间表示两端都不取走时中间取走的最小花费. #include &l ...