据序和中序序列或者也许为了一个二进制序列,恢复二进制和打印图像(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; ...
随机推荐
- windows phone (25) Canvas元素B
原文:windows phone (25) Canvas元素B ZIndex 这也是一个附加属性,表示canvas的children集合内的子元素的显示顺序,在canvas中的元素默认情况下是后面的 ...
- 简单的刷票系统(突破IP限制进行投票) (转)
前言 相信大家平时肯定会收到朋友发来的链接,打开一看,哦,需要投票.投完票后弹出一个页面(恭喜您,您已经投票成功),再次点击的时候发现,啊哈,您的IP(***.***.***.***)已经投过票了,不 ...
- Android如何获得手机power_profile.xml文件
上的能量消耗进行最近的测试,阅读文章一个月,最后,我们发现了一些新的想法,但产生的问题.那 工作无法再进行下去. 在Android手机中,对于手机中的每一个部件(cpu.led.gps.3g等等)执行 ...
- Zabbix的数据表结构
看到Zabbix的数据表结构吧,就知道数据量大了 性能问题很让人担忧,不过基于Zabbix数据库导出报表,或自动跑报表的时候,就必须去了解一下zabbix的数据表结构了,得知道XX放在哪才能找到XX, ...
- 工作经常使用的SQL整理,实战篇(二)
原文:工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实 ...
- C# 6.0 (C# vNext) 的新功能:Expression Bodied Functions and Properties
Expression Bodied Function 它可以用在: methods user-defined operators type conversions read-only properti ...
- TRIZ系列-创新原理-22-变害为利原理
变害为利原理的详细表述例如以下:1)利用有害的因素(特别是环境中的)获得积极的效果: 有害无害不过相对的(时间,空间,人),将有害的因素通过一定的处理和转化,能够变有害为实用,比方废品回收, ...
- html5移动开发--js温馨提示
1.a标签执行js笔试 <a id="myID" href="javascript:myfuction();"></a> 2.实时监听i ...
- sublime配置攻略
大家好,今天给大家分享的编辑器:sublime text2 我用过非常多编辑器, EditPlus.EmEditor.Notepad++.Notepad2.UltraEdit.Editra.V ...
- Gradle构建多模块项目(转)
废话不多说,直接进入主题. 1. 创建项目 首先创建项目,名称为 test: mkdir test && cd test gradle init 这时候的项目结构如下: ➜ test ...