c语言生成二进制序列,据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)...

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

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

if(str[i]==x){

return i;

}

}

return -1;

}

//将str字符串切割

void getFastEnd(char* str,char x,char result[2][100]){

strcpy(result[0],"\0");

strcpy(result[1],"\0");

if(strlen(str)==0 || strlen(str)==1){

return;

}

if(getIndex(str,x) == 0){

strcpy(result[1],str+1);

}else if(getIndex(str,x) == strlen(str)-1){

strcpy(result[0],str);

result[0][strlen(str)-1]='\0';

}else{

strcpy(result[0],strtok(str,&x));

strcpy(result[1],strtok(NULL,&x));

}

}

//根据前序和中续生成一颗二叉树

int fIndex=0;//标识前序进行了几个了

void getTreeForF_M(char* proOrder,char* inOrder,BinTree* T){

BinTree temp = NULL;

char result[2][100];//存储左右孩子的中序序列

if(*inOrder==NULL){//其中序序列为空时将指向该子树的指针设置为NULL

*T = NULL;

}else{

temp = (BinTree)malloc(sizeof(binNodt));

temp->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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值