#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. kaggle CTR预估

    参考涛哥之前做过的CTR预估project,学习下CTR预估的相关知识:http://blog.csdn.net/hero_fantao/article/category/6877765 目标:本周末 ...

  2. POJ 3624 Charm Bracelet(0-1背包模板)

    http://poj.org/problem?id=3624 题意:给出物品的重量和价值,在重量一定的情况下价值尽可能的大. 思路:经典0-1背包.直接套用模板. #include<iostre ...

  3. 下列java代码中的变量a、b、c分别在内存的______存储区存放。

    class A{ private String a = "aa"; public boolean methodB(){ String b = "sb"; fin ...

  4. 哈希表-java

    import java.util.HashMap; import java.util.Iterator; public class JavaHashMap { public static void m ...

  5. 磁条卡,IC卡,ID卡,信用卡芯片卡,信用卡磁条卡 等等的区别

    1.条码卡:该卡卡面上有一串条码,通过扫描枪或者相应的条码读卡器读出该条码卡的卡号.根据条码的不同又分为39码等其它码.条码卡仅仅是一个编号,不存蓄其它内容.特点:价格便宜类似磁卡. 2.磁条卡:类似 ...

  6. DataTable转化成实体对象

    /// <summary> /// The data extension. /// </summary> public static class DataExtension { ...

  7. 通过 sqldf 包使用 SQL 查询数据框

    在前面的章节中,我们学习了如何编写 SQL 语句,在关系型数据库(如 SQLite 和MySQL )中查询数据.我们可能会想,有没有一种方法,能够直接使用 SQL 进行数据框查询,就像数据框是关系型数 ...

  8. Codeforces 918C - The Monster

    918C - The Monster 思路1: 右键在新窗口打开图片 代码: #include<bits/stdc++.h> using namespace std; #define ll ...

  9. apktool 打包解包apk的总结

    1) 不需要另外下载 baksmali-2.1.2.jar, apktool.jar 好像都包含了. apktool d zhanqi.xxx.apk -o zhanqi 2) smalidea-0. ...

  10. English trip -- VC(情景课)4 C My feet hurt 我脚痛

    xu言: You're the best... Grammar focus 语法点: eye  eyes hand hands foot feet tooth  teeth arm arms leg  ...