NYOJ-756重建二叉树
2016-06-03 18:19
519 查看
重建二叉树
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
输入
输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。
输出
每组输出数据单独占一行,输出对应得先序序列。
样例输入
ACBFGED ABCDEFG
CDAB CBAD
样例输出
DBACEGF
BCAD
//从后序中找到根(最后一个结点),然后确定根在中序中的位置,从而可以将中序序列分为左右子序列,后序中按此左序列的长度确定的序列即为后序左序列,
//后序中剩下的序列去掉根即为后序右序列,递归建树,然后NLR遍历
//非递归输出
//不建树直接输出前序序列
补充:如果已知前序、中序,求后序
参照:http://www.tuicool.com/articles/jaiAVj
2016-07-06
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
输入
输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。
输出
每组输出数据单独占一行,输出对应得先序序列。
样例输入
ACBFGED ABCDEFG
CDAB CBAD
样例输出
DBACEGF
BCAD
//从后序中找到根(最后一个结点),然后确定根在中序中的位置,从而可以将中序序列分为左右子序列,后序中按此左序列的长度确定的序列即为后序左序列,
//后序中剩下的序列去掉根即为后序右序列,递归建树,然后NLR遍历
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct node{ char data; struct node *lchild,*rchild; }BitNode,*BiTree; void GetPreorder(char *last,char *mid,BiTree &T,int len) { if(!len) { T = NULL; return; } char ch = last[len-1];//得到根结点 int index = 0;//索引记录根结点在中序中的位置 while(mid[index] != ch) index ++; T = (BiTree)malloc(sizeof(BitNode));//为根结点开辟空间 T->data = ch; //递归建立左子树和右子树 GetPreorder(last,mid,T->lchild,index); GetPreorder(last+index,mid+index+1,T->rchild,len-index-1); } void Preorder(BiTree T) { if(T) { putchar(T->data); Preorder(T->lchild); Preorder(T->rchild); } } int main() { char mid[26],last[26]; while(scanf("%s%s",last,mid) != EOF) { BiTree T; GetPreorder(last,mid,T,strlen(mid));//last,mid接收字符串后系统自动加'\0' Preorder(T); puts(""); } return 0; }
//非递归输出
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 26 typedef struct node{ char ch; struct node *lchild,*rchild; }BitNode,*BiTree; typedef struct sqstack{ int top; BitNode* ch[MAXSIZE];//数组中每个元素都是树中结点指针 }Sqstack; void GetPreorder(char *post,char *mid,BiTree &T,int len) { if(!len) { T = NULL; return; } int index = strchr(mid,post[len-1]) - mid; T = (BitNode *)malloc(sizeof(BitNode)); T->ch = post[len-1]; GetPreorder(post,mid,T->lchild,index); GetPreorder(post+index,mid+index+1,T->rchild,len-index-1); } void IniStack(Sqstack &S) { S.top = -1; } int IsEmpty(Sqstack S) { if(S.top == -1) return 1; else return 0; } void Push(Sqstack &S,BiTree T) { S.ch[++S.top] = T; } void Pop(Sqstack &S,BiTree &T) { T = S.ch[S.top--]; } void Preorder(BiTree T) { Sqstack S; IniStack(S); while(T || !IsEmpty(S)) { if(T) { putchar(T->ch);//visit Push(S,T); T = T->lchild; } else{ Pop(S,T); T = T->rchild; } } } int main() { char post[26],mid[26]; while(scanf("%s%s",post,mid) != EOF) { BiTree T; GetPreorder(post,mid,T,(int)strlen(post)); Preorder(T);//非递归 puts(""); } return 0; }
//不建树直接输出前序序列
//author:1495457 #include <stdio.h> #include <string.h> void preorder(char *post,char *mid,int len) { if(!len) return; putchar(post[len-1]); int index = strchr(mid,post[len-1]) - mid;//strchr:在一个串中查找给定字符的第一个匹配之处 preorder(post,mid,index); preorder(post+index,mid+index+1,len-index-1); } int main() { char post[26],mid[26]; while(scanf("%s%s",post,mid) != EOF) { preorder(post,mid,strlen(post)); puts(""); } }
补充:如果已知前序、中序,求后序
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct node{ char data; struct node *lchild,*rchild; }BitNode,*BiTree; void GetPostorder(char *pre,char *mid,BiTree &T,int len) { if(!len) { T = NULL; return; } char ch = pre[0];//得到根结点 int index = 0;//索引记录根结点在中序中的位置 while(mid[index] != ch) index ++; T = (BiTree)malloc(sizeof(BitNode));//为根结点开辟空间 T->data = ch; //递归建立左子树和右子树 GetPostorder(pre+1,mid,T->lchild,index); GetPostorder(pre+index+1,mid+index+1,T->rchild,len-index-1); } void Postorder(BiTree T) { if(T) { Postorder(T->lchild); Postorder(T->rchild); putchar(T->data); } } int main() { char pre[26],mid[26]; while(scanf("%s%s",pre,mid) != EOF) { BiTree T; GetPostorder(pre,mid,T,strlen(pre)); Postorder(T); puts(""); } return 0; } //前、中 //DBACEGF ABCDEFG ACBFGED //ABCDEFG BCDAGFE DCBGFEA
参照:http://www.tuicool.com/articles/jaiAVj
2016-07-06
相关文章推荐
- ROS中 package.xml CMakeList.txt launch文件
- leetcode-Java-18. 4Sum
- 【转】java获取当前路径的几种方法
- 0x80050142 No spatial reference exists 解决思路
- 2.5.位运算实战演练2--技术升级:用宏定义来完成位运算
- .balignl 16,0xdeadbeef浅析
- iOS实践:天气App
- angularjs $http提交数据探索
- 整数运算:CPU内部只有加法运算
- 矩阵维度与通道
- C语言和c++中的const、static、extern
- laravel视图提交表单到控制器的使用需要注意配置事项
- ascii码所有字符对照表(包含汉字和外国文字)
- java split
- 《java入门第一季》之HashSet存储元素保证唯一性的代码及图解
- 转载 TextInputLayout
- make my android ps command on NDK
- c++上机实验7项目1
- 《java入门第一季》之HashSet存储元素保证唯一性的代码及图解
- js字符串函数 [http://www.cnblogs.com/qfb620/archive/2011/07/28/2119799.html]