据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)
首先要预购和序,以恢复它:
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
版权声明:本文博客原创文章,博客,未经同意,不得转载。
据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(c语言)的更多相关文章
- DS Tree 已知后序、中序 => 建树 => 求先序
注意点: 和上一篇的DS Tree 已知先序.中序 => 建树 => 求后序差不多,注意的地方是在aftorder中找根节点的时候,是从右往左找,因此递归的时候注意参数,最好是拿纸和笔模拟 ...
- DS Tree 已知先序、中序 => 建树 => 求后序
参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...
- 剑指offer——已知二叉树的先序和中序排列,重构二叉树
这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2, ...
- PAT Advance 1119 Pre- and Post-order Traversals (30) [树的遍历,前序后序转中序]
题目 Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree c ...
- 二叉排序树的构造 && 二叉树的先序、中序、后序遍历 && 树的括号表示规则
二叉排序树的中序遍历就是按照关键字的从小到大顺序输出(先序和后序可没有这个顺序) 一.以序列 6 8 5 7 9 3构建二叉排序树: 二叉排序树就是中序遍历之后是有序的: 构造二叉排序树步骤如下: 插 ...
- PTA 二叉树的三种遍历(先序、中序和后序)
6-5 二叉树的三种遍历(先序.中序和后序) (6 分) 本题要求实现给定的二叉树的三种遍历. 函数接口定义: void Preorder(BiTree T); void Inorder(BiTr ...
- PTA 根据后序和中序遍历输出先序遍历 (25分)
PTA 根据后序和中序遍历输出先序遍历 (25分) 本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果. 输入格式: 第一行给出正整数N(≤30),是树中结点的个数.随后两行 ...
- [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; ...
随机推荐
- 《Javascript高级程序设计》读书笔记之bind函数详解
为什么需要bind var name = "The Window"; var object = { name: "My Object", getNameFunc ...
- Android Tombstone/Crash的log分析和定位
有一句话叫做常在河边走,哪有不湿鞋.我们这些研究和开发Android的project师正应了这句话,相必大家在调试的时候常常会遇到这么个东西吧 *** *** *** *** *** *** *** ...
- C#四舍五入保留两位小数
- Scripting Java #3:Groovy与invokedynamic
只需看看今天Groovy语言实现机制.在此之前,是第一个推倒静态类型与动态类型语言在实现上面的一些差异. 静态类型 vs. 动态类型 看以下这个简单的栗子. def addtwo(a, b) { re ...
- 取证学习资料DVD
http://www.infiniteskills.com/training/learning-computer-forensics.html https://www.youtube.com/watc ...
- unity3d插入Daikon Forge GUI 中国课程-7-高级控制slider采用
(游戏开始的牛市)大家好我是孙广东.官方网站提供的是专业的视频教程http://www.daikonforge.com/dfgui/tutorials/,只是是在youtube上,要观看是须要FQ的. ...
- HTML5_表单元素
<!DOCTYPE html> <hmtl> <html lang="zh-cn"> <head> <meta charse ...
- ps设计资料整理
零基础学会建立一个简单化妆品网站—前台设计篇1[PS画草图] http://xiebiji.com/2008/09/huazhuang4/?wptheme=Plainscape&ie=1 PS ...
- java基础程序题
发现自己初学java时保存在word里的练习题,哈哈,放博客里面来作为纪念吧~~~ [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔 ...
- Windows 7 USB DVD Download Tool 制作的U盘无法启动安装Windows7 SP1
以前用此工具安装Windows7一直正常,未遇到不能启动安装的问题.Windows7 SP1出来后,用此工具制作安装多台机器均不能引导安装(品牌机和兼容机均是如此 ),要么停留在光标闪烁的状态,要么就 ...