博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)...
阅读量:5807 次
发布时间:2019-06-18

本文共 3645 字,大约阅读时间需要 12 分钟。

首先要预购和序,以恢复它:

1.首先,我们使用的是递归的方式来完成

2.递归的最小单位:一个空的树和书的前言和第一序。该序列的第一个元素是树的第一序列根,调用这种方法

3.递归的终止条件是。当这棵树的中序序列为空的时候就停止。

同理依据后序和中序序列也是一样的道理:

我们能够发现兴许序列就是先序序列的倒置

#include 
#include
#include
#define MAXNODE 100#include
static void gotoxy(int x, int y) { COORD c; c.X = x - 1; c.Y = y - 1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);}typedef struct Node{ char data; struct Node* lchild; struct Node* rchild;}*BinTree,binNodt;//递归前序遍历二叉树void PreOrder(BinTree T){ if(T == NULL){ return; } printf("%c",T->data); PreOrder(T->lchild); PreOrder(T->rchild);}//递归中序遍历二叉树void InOrder(BinTree T){ if(T == NULL){ return; } InOrder(T->lchild); printf("%c",T->data); InOrder(T->rchild);}//递归兴许遍历二叉树void PostOrder(BinTree T){ if(T == NULL){ return; } PostOrder(T->lchild); PostOrder(T->rchild); printf("%c",T->data);}//图像输出/* 以满二叉树为考虑对象: 为了确保父节点与子节点之间的有交错感觉所以: 二叉树最左边的叶子到根节点的水平距离为:根节点左子数的节点个数.2^(k-2) k是层数 根的层数为1*/int xxx=0;int yyy=6;void print(BinTree T,int level,int offset){//T,1,0 xxx++; if(T == NULL) return ; else { print(T->lchild,level+1,offset-1); gotoxy(xxx*2,(level*2)+yyy); //printf("%c(%d,%d) ",T->data,offset,level); printf("%c",T->data); if(T->lchild!=NULL){ gotoxy(xxx*2-1,(level*2)+yyy+1); printf("/"); } if(T->rchild!=NULL){ gotoxy(xxx*2+1,(level*2)+yyy+1); printf("\\"); } print(T->rchild,level+1,offset+1); }}//查找字符的位置int getIndex(char * str,char x){ int i; for(i=0;i
data = proOrder[fIndex++]; temp->lchild=NULL; temp->rchild=NULL; *T = temp; getFastEnd(inOrder,temp->data,result); //将中序序列根据当前根的值切割成两段 getTreeForF_M(proOrder,result[0],&(temp->lchild));//恢复左子树 getTreeForF_M(proOrder,result[1],&(temp->rchild));//恢复右子树 }}//根据 后序和中序生成一颗二叉树int eIndex=1;void getTreeForE_M(char* endOrder,char* inOrder,BinTree* T){ BinTree temp=NULL; char result[2][100]; if(*inOrder==NULL){ *T=NULL; }else{ temp = (BinTree)malloc(sizeof(binNodt)); temp->data = endOrder[strlen(endOrder)-eIndex++]; temp->lchild=NULL; temp->rchild=NULL; *T = temp; getFastEnd(inOrder,temp->data,result); //将中序序列根据当前根的值切割成两段 getTreeForE_M(endOrder,result[1],&(temp->rchild));//恢复右子树 getTreeForE_M(endOrder,result[0],&(temp->lchild));//恢复左子树 }}int main(){ char temp[2][100]; char pro[100]="ABCDEFGHI"; char in[100]="BCAEDGHFI"; char en[100]="CBEHGIFDA"; BinTree T=NULL; //getTreeForF_M(pro,in,&T); getTreeForE_M(en,in,&T); printf("\n"); printf("前序遍历:"); PreOrder(T); printf("\n中序遍历:"); InOrder(T); printf("\n后序遍历:"); PostOrder(T); printf("\n图像输出:"); print(T,1,0); getchar(); return 0;}

在上面结构的基础上还能够获取某一层的数据。二叉树的深度。二叉树的层次遍历等方法:

//打印二叉树某一层的节点void TransLevel(BinTree T,int level){    if(T == NULL)        return ;    else    {        if(level == 1)           printf("%c ",T->data);        else        {            TransLevel(T->lchild,level-1);            TransLevel(T->rchild,level-1);        }    }}//二叉树层次便利void LevelOrder(BinTree T){	BinTree Queue[MAXNODE];	int f,r;	if(T == NULL)		return;	f=-1;	r=0;	Queue[r]=T;//将头指针入队	while(r!=f){//队列不为空就循环		f++;//出队		printf("%c",Queue[f]->data);		if(Queue[f]->lchild!=NULL){			r++;//入队			Queue[r]=Queue[f]->lchild;		}		if(Queue[f]->rchild!=NULL){			r++;//入队			Queue[r]=Queue[f]->rchild;		}	}}//获取二叉树的深度void LevelNum(BinTree T,int level){	int temp = 1;	if(T == NULL)        return;    else    {        if(level > num){//假设当前层大于num就交换			num = level;        }            LevelNum(T->lchild,level+1);            LevelNum(T->rchild,level+1);    }}

有那写的不妥当的我们一起来交流!

http://blog.csdn.net/manageer/article/details/24519987

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>
系统版本判断
查看>>
关于Css选择器优先级
查看>>
My97DatePicker 日历插件
查看>>
0603 学术诚信与职业道德
查看>>
小点心家族第3位成员——楼层定位效果
查看>>
Knockout.Js官网学习(enable绑定、disable绑定)
查看>>
hive基本操作与应用
查看>>
excel快捷键设置
查看>>
poj3692
查看>>
python之信号量【Semaphore】
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
[Vim] 搜索模式(正则表达式)
查看>>
#HTTP协议学习# (二)基本认证
查看>>
Android开发之线性布局详解(布局权重)
查看>>
WCF
查看>>
django 目录结构修改
查看>>