首先要预购和序,以恢复它:

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语言)的更多相关文章

  1. DS Tree 已知后序、中序 => 建树 => 求先序

    注意点: 和上一篇的DS Tree 已知先序.中序 => 建树 => 求后序差不多,注意的地方是在aftorder中找根节点的时候,是从右往左找,因此递归的时候注意参数,最好是拿纸和笔模拟 ...

  2. DS Tree 已知先序、中序 => 建树 => 求后序

    参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...

  3. 剑指offer——已知二叉树的先序和中序排列,重构二叉树

    这是剑指offer中关于二叉树重构的一道题.题目原型为: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2, ...

  4. 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 ...

  5. 二叉排序树的构造 && 二叉树的先序、中序、后序遍历 && 树的括号表示规则

    二叉排序树的中序遍历就是按照关键字的从小到大顺序输出(先序和后序可没有这个顺序) 一.以序列 6 8 5 7 9 3构建二叉排序树: 二叉排序树就是中序遍历之后是有序的: 构造二叉排序树步骤如下: 插 ...

  6. PTA 二叉树的三种遍历(先序、中序和后序)

    6-5 二叉树的三种遍历(先序.中序和后序) (6 分)   本题要求实现给定的二叉树的三种遍历. 函数接口定义: void Preorder(BiTree T); void Inorder(BiTr ...

  7. PTA 根据后序和中序遍历输出先序遍历 (25分)

    PTA 根据后序和中序遍历输出先序遍历 (25分) 本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的先序遍历结果. 输入格式: 第一行给出正整数N(≤30),是树中结点的个数.随后两行 ...

  8. [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 ...

  9. JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)

    import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; ...

随机推荐

  1. LeetCode: Valid Palindrome [125]

    [题目] Given a string, determine if it is a palindrome, considering only alphanumeric characters and i ...

  2. spoj Balanced Numbers(数位dp)

    一个数字是Balanced Numbers,当且仅当组成这个数字的数,奇数出现偶数次,偶数出现奇数次 一下子就相到了三进制状压,数组开小了,一直wa,都不报re, 使用记忆化搜索,dp[i][s] 表 ...

  3. 移动web性能优化笔记

    移动web性能优化 最近看了一些文章,对移动web性能优化方法,做一个简单笔记 笔记内容主要出自 移动H5前端性能优化指南和移动前端系列——移动页面性能优化

  4. WEB-INF文件夹的位置和作用

    WEB-INF简介 TomCat 服务器下的WEB-INF文件夹是一个非常安全的文件,在页面中不能直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问. WEB-INF文件 ...

  5. 一旦ORA-28000: the account is locked用户锁定故障排除

    今天我的同事们反映的问题,测试库的变化password,并改变相关的应用程序中使用password后,其中一个仍然会出现在帐户被锁定,报告ORA-28000: the account is locke ...

  6. C经典之14-双向链表存储1-10---ShinePans

    #include <stdio.h> #include <conio.h> #include <stdlib.h> //system(); 这个指令须要用到此头文件 ...

  7. C++0x新特性

    我是在一个帖子上摘抄的大神语录...感谢supermegaboy大神,给了详尽的解释 下文是一篇转载的Wikipedia的译文,从语言和库双方面概述了C++0x. 右值引用与转移语义 在标准C++语言 ...

  8. hdu3501

    要我们求小于n并且不与n互素的数字的和, 那么可以转化为1->(n-1)的和减去小于n且与n互素的数字的和 首先,有gcd(n,i)=1, 那么gcd(n,n-i)=1, 这是因为如果a%s=0 ...

  9. 树形dp专辑

    hdu 2196 http://acm.hdu.edu.cn/showproblem.php?pid=2196 input 5//5个结点 1 1//表示结点2到结点1有一条权值为1的边 2 1//表 ...

  10. windows phone (27) 基础Button

    原文:windows phone (27) 基础Button Button 在wp7中因其灵活性经常会用到,我们在ContentPanel中直接添加Button,button默认状态下是把整个grid ...