uva 548
来源:互联网 发布:索尼kdl60w600b装软件 编辑:程序博客网 时间:2024/05/22 17:32
uva 548
这个题是一个关于利用二叉树的中序和后序来确定一棵树的题,先前全做的都是通过先序和中序来确定一颗二叉树,所以还想了好久。
总体思路就是,现将二叉树的后序遍历的顺序直接反转,然后通过后序遍历反转以后的第一个数字就是根节点,下来是右子树,下来是左子树以此类推就可以了。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Tnode{
int value;
int node;
}Node;
Node value[30000];
int index=0,the_min=9999999;
void build(int n,int *s1,int *s2,int total){
int p;
if(n<=0)
return;
total+=s1[0];
if(n==1){
value[index].value=total;
value[index].node=s1[0];
index++;
if(the_min>total)
the_min=total;
}
p=search(s1[0],s2,n);
build(n-p-1,s1+1,s2+p+1,total);
build(p,s1+(n-p),s2,total);
}
int search(int num,int * arr,int len){
int i;
for(i=0;i<len;i++)
if(arr[i]==num)
return i;
return 0;
}
int reverse(int *arr,int len){
int i,temp;
for(i=0;i<len/2;i++){
temp=arr[i];
arr[i]=arr[len-i-1];
arr[len-i-1]=temp;
}
}
int main(){
int input1[30000],i=0,j,input2[30000],flag=0,total=0,k;
char ch;
while(scanf("%d%c",input1+i,&ch)==2){
if(ch=='\n')
flag=1;
else
i++;
while(flag==0 && scanf("%d%c",input1+i,&ch)==2){
if(ch=='\n')
break;
i++;
}
for(j=0;j<=i;j++)
scanf("%d%*c",input2+j);
reverse(input2,j);
build(j,input2,input1,total);
flag=i=0;
for(k=0;k<index;k++)
if(value[k].value==the_min)
printf("%d\n",value[k].node);
index=0;
the_min=99999999;
}
return 0;
}
- uva 548
- UVA 548
- uva 548
- uva 548
- uva 548
- uva 548
- uva 548
- uva 548
- uva 548
- uva 548
- UVa 548
- uva 548
- UVA 548
- Uva 548
- UVA 548
- UVa 548 Tree
- uva 548 Tree
- uva 548 - Tree
- 算法导论学习笔记(一)排序算法之插入排序
- PB动态SQL语句
- 【JAVA/读书随笔】Chapter 22 算法效率
- 苹果设备3.5英寸,4英寸,4.7英寸,5.5英寸屏幕像素指南
- 配置https双向认证过程实战(tomcat和浏览器交互)
- uva 548
- poj1836
- 视音频数据处理入门:FLV封装格式解析
- 构建工具之---ant
- MyEclipse中改变.jsp默认的设计图模式为jsp editor
- EJB基础二 异步调用
- 学习笔记—解析XML
- 关于ztree创建
- eclipse错误:parseSdkContent failed Could not initialize class android.graphics