据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)
2023-09-14 09:08:09 时间
首先要预购和序,以恢复它:
1.首先,我们使用的是递归的方式来完成
2.递归的最小单位:一个空的树和书的前言和第一序。该序列的第一个元素是树的第一序列根,调用这种方法
3.递归的终止条件是。当这棵树的中序序列为空的时候就停止。
同理依据后序和中序序列也是一样的道理:
我们能够发现兴许序列就是先序序列的倒置
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXNODE 100 #include <windows.h> 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<strlen(str);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
版权声明:本文博客原创文章,博客,未经同意,不得转载。
相关文章
- Java实现 LeetCode 376 摆动序列
- Java实现P2102 -- 正整数序列
- Java实现 蓝桥杯VIP 算法提高 最长公共子序列
- Java实现 蓝桥杯VIP 算法提高 最长字符序列
- 最长公共子序列
- SAP UI5 Fiori 应用在启动时向 ABAP 后台发起的 OData 请求序列的顺序和作用分析
- 编程笔试(解析及代码实现):求和为N的正整数序列之实现一个函数,输入为一个正整数N (比如100),输出为所有和等于N的[连续]正整数序列
- PGSQL Sequence序列
- 最长特殊序列 Ⅰ(C++)
- 【ESN-PSO】基于PSO的回波状态网络参数分析,用于时间序列预测(Matlab代码实现)
- Leetcode 1218. 最长定差子序列
- Verilog实现模三检测器,设计输入序列能否被三整除,RTL设计+testbenc验证
- 含有无关项的序列检测
- 如何判断出栈序列的合法性?
- 【C++】算法集锦(13):最长递增子序列
- 计算序列1的计数(verilog)