据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(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; ...
随机推荐
- hibernate 一对多,多对一,多对多实体映射完美解决方案(再也不会糊涂了,哈哈)
- 什么是比特币(Bitcoin)?
比特币是一种类型的电子货币.点对点(P2P)网络跟踪和验证交易.比特币系统不涉及金融机构,因此它不需要中央监控单元以控制该货币.它可以利用网络作为现金. 比特币系统 比特币是在处理称为区块(block ...
- MultiROM for the XIAOMI MI2S/2C/2! (Kexec HardBoot Enabled with Kexec HardBoot Patch!)
Introduction This is a port of Tassadar's MultiROM, a multi-boot mod for XIAOMI MI2/2S/2C. The main ...
- ZeroBrane Studio远程调试Lua程序(转)
环境: ZeroBrane Studio安装在Windows 7上,而要调试的程序运行在CentOS上: 设置: 在windows 7上,打开ZeroBrane Studio,打开需要调试的文件,例如 ...
- [转载] 创建为ClickOnce清单签名的.pfx格式数字证书
使用vs2013自动创建的.pfx数字证书默认有效期只有一年,并且“颁发者”.“颁发给”均为当前机器名和当前登陆用户名的组合,其实我们完全可以创建更友好的.pfx数字证书. 打开Microsoft . ...
- VMWare网络设置的3中方式(转)
一 VMware网络设置的三种方式 1 Host-only连接方式 让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址 ...
- 9、Cocos2dx 3.0游戏开发找小三之工厂方法模式与对象传值
重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27704153 工厂方法模式 工厂方法是程序设计中一个 ...
- 玩转Web之easyui(三)-----easy ui dataGird 重新指定url以获取不同数据源信息
如果已经写了一个dataGird并且已经通过url绑定数据源,能不能在其他地方改变url使其从不同数据源获取信息,从而实现查询等操作?答案当然是肯定的,而且仅需要几行代码 $('#btnq').bin ...
- PHP情人:p十几天来学习hp第一天
我这里是暂时的 Apache web server 和 MY SQL 如WEB,在php-4.3.3下的环境做的程序.当然要简单的构建和訪问查看数据库 PHPMYADMIN 不可少. 以下简介一下P ...
- 读书时间《JavaScript高级程序设计》六:事件
Javascript与HTML之间的交互是通过事件实现的. 1. 事件流 事件流描述的是从页面中接收事件的顺序. <!DOCTYPE html> <html> <head ...