首先要预购和序,以恢复它:
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
版权声明:本文博客原创文章,博客,未经同意,不得转载。