UVA 548-Tree(二叉树)
来源:互联网 发布:中美对抗 知乎 编辑:程序博客网 时间:2024/05/10 21:36
题目大意:给出二叉树的中序遍历和后序遍历,求一个叶子结点,它到根的距离最短,若有多个解叶子权值应该最小。
递归遍历,每次找到当次递归的根然后递归左子树和右子树,后序遍历的最后一个结点就是根,在递归过程中记录根到当前结点的距离,这样可以在递归到达叶子时就能得到那个叶子结点到根的距离。这样可以不用恢复二叉树。
#include<stdio.h>#include<stdlib.h>#include<string.h>int a[10010];int b[10010];int c[10010];char e[100010];int dis[10010];int isleaf[10010];int sum;void dfs(int u,int v,int p);int main(void){int i,topa,topb,sump,lo,min,minans;while(gets(e)!=NULL){topa=topb=sum=0;lo=strlen(e);i=0;while(i<lo){if((e[i]>='0')&&(e[i]<='9')){sump=0;while((e[i]>='0')&&(e[i]<='9')){sump=sump*10+e[i]-'0';i++;}a[++topa]=sump;}else{i++;}}gets(e);lo=strlen(e);i=0;while(i<lo){if((e[i]>='0')&&(e[i]<='9')){sump=0;while((e[i]>='0')&&(e[i]<='9')){sump=sump*10+e[i]-'0';i++;}b[++topb]=sump;}else{i++;}}for(i=1;i<=topa;i++){c[a[i]]=i;isleaf[b[i]]=dis[b[i]]=0;}dfs(1,1,topa);min=(1<<30);minans=0;for(i=1;i<=topa;i++){if(isleaf[a[i]]==1){if((dis[a[i]]<min)||((dis[a[i]]==min)&&(a[i]<minans))){min=dis[a[i]];minans=a[i];}}}printf("%d\n",minans);}return 0;}void dfs(int u,int v,int p){int j,uu,vv;if(p==1){isleaf[a[u]]=1;dis[a[u]]=sum+a[u];}else{sum+=b[v+p-1];j=c[b[v+p-1]];uu=u+p-1-j;vv=p-uu-1;if(uu>0){dfs(j+1,v+p-1-uu,uu);}if(vv>0){dfs(u,v,vv);}sum-=b[v+p-1];}}
0 0
- UVA 548-Tree(二叉树)
- UVa 548 - Tree(二叉树)
- UVA 548Tree(二叉树建树)
- 二叉树 UVA 548 Tree
- UVA - 548 Tree 二叉树
- UVa--548 Tree(二叉树)
- UVA 548 Tree(二叉树的建立)
- UVa 548 - Tree【二叉树的递归遍历(DFS)】
- UVA 548 Tree(数据结构,二叉树,遍历)
- 【UVA 548 Tree】二叉树构造 & 遍历
- UVa 548 - Tree 二叉树的重建与遍历
- uva 548 tree 二叉树的各种遍历
- Uva-548-Tree(二叉树与stream与dfs)
- UVA 548 Tree(中序+后序还原二叉树)
- UVA 536-Tree Recovery(二叉树恢复)
- UVA 536 - Tree Recovery(二叉树重建)
- Uva 248 Tree//二叉树遍历,递归
- UVa 536 Tree Recobery 二叉树重建
- Python爬虫/文本处理/科学计算/机器学习——工具包总结
- UVA - 10271 Chopsticks
- PAT A1001 A+B Fomat
- hihocoder第十二周刷油漆
- Cell的重用代码
- UVA 548-Tree(二叉树)
- Cell的重用原理
- X Window ---- Linux 桌面的 GUI
- Android 调用.so文件 jni
- Cell简介
- 《Python核心编程》第五章练习解析
- 初始MVC
- UITableView
- 二级指针基础知识