POJ 3437 Tree Grafting
来源:互联网 发布:淘宝转淘口令api 编辑:程序博客网 时间:2024/06/09 09:20
Tree Grafting
Description
- there is one node designated as the root, denoted root(T);
- the remaining nodes are partitioned into subsets T1, T2, ..., Tm, each of which is also a tree (subtrees).
It is often more convenient to represent an ordered tree as a rooted binary tree, so that each node can be stored in the same amount of memory. The conversion is performed by the following steps:
- remove all edges from each node to its children;
- for each node, add an edge to its first child in T (if any) as the left child;
- for each node, add an edge to its next sibling in T (if any) as the right child.
This is illustrated by the following:
0 0 / | \ / 1 2 3 ===> 1 / \ \ 4 5 2 / \ 4 3 \ 5
In most cases, the height of the tree (the number of edges in the longest root-to-leaf path) increases after the conversion. This is undesirable because the complexity of many algorithms on trees depends on its height.
You are asked to write a program that computes the height of the tree before and after the conversion.
Input
The input is given by a number of lines giving the directions taken in a depth-first traversal of the trees. There is one line for each tree. For example, the tree above would give dudduduudu, meaning 0 down to 1, 1 up to 0, 0 down to 2, etc. The input is terminated by a line whose first character is #. You may assume that each tree has at least 2 and no more than 10000 nodes.
Output
For each tree, print the heights of the tree before and after the conversion specified above. Use the format:
where t is the case number (starting from 1), h1 is the height of the tree before the conversion, and h2 is the height of the tree after the conversion.Tree t: h1 => h2
Sample Input
dudduduududdddduuuuudddduduuuudddduuduuu#
Sample Output
Tree 1: 2 => 4Tree 2: 5 => 5Tree 3: 4 => 5Tree 4: 4 => 4
分析:
题目意思就是把普通有序树转化成二叉树。输入'd'为向下新建一个结点,'u'为向上回溯一个结点。其实就是前序遍历。每一个结点当前深度为姐妹序号和父亲序号之和,如题目中的'4'结点就是姐妹序号1和父亲序号2之和3。很容易想到递归思想。除了递归,其实还可以这样做!把二叉树左右收拢成一条竖线,用数组来表示。
代码如下:
/*如果max()函数有问题的话,加上inline int max(int a,int b) {return a>b?a:b;}这个函数体试试*/#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;#define Max 10004char str[3*Max];int t[Max]; //当前结点序数int p[Max]; //当前路径深度int s[Max]; //子结点个数int main(){ int i, j, dp, len, plus=0; while(gets(str) && strcmp(str,"#")!=0) { len = strlen(str); memset(s, 0, sizeof(s)); for(j=0,i=0,dp=0,p[0]=0; j<len; j++) { switch(str[j]) { case 'd' : i++; //当前深度 t[i] = s[i-1]+1; //姐妹结点序号 p[i] = 0; //把该结点以下链长清零 s[i] = 0; //把该结点分叉数清零 dp = max(i, dp); //记录转化前树的深度 break; case 'u' : i--; //当前深度 p[i] = max(p[i], p[i+1]+t[i+1]); //转化为二叉后该结点以下链长 s[i] = t[i+1]; //转化为二叉前该结点分叉数 break; } } printf("Tree %d: %d => %d\n",++plus,dp,p[0]); } return 0;}
- POJ 3437 Tree Grafting
- POJ 3437 Tree Grafting
- POJ 3437 Tree Grafting
- POJ 3437 Tree Grafting
- POJ---3437-Tree Grafting
- Tree Grafting(POJ 3437)
- POJ 3437 Tree Grafting 多叉树转二叉树
- POJ 3437 Tree Grafting(二叉树高度)
- Tree Grafting
- Tree Grafting
- POJ 3437 Tree Grafting(有序树转化为二叉树)
- Poj Tree Grafting 解题报告 (左儿子右兄弟)
- (二叉树递归)A - Tree Grafting(9.1.1)
- Tree Grafting,树转换成二叉树,tree recovery,遍历顺序确定二叉树
- po3437求出有序树转化为二叉树前后的高度 Tree Grafting
- POJ Tree
- Tree POJ
- poj-2255-Tree Recovery(tree)
- Oracle 11g Data Guard环境中的归档管理
- CPU缓存刷新的误解
- 模板整理之KMP
- 杭电ACM2075A|B?------20140801
- 【华为OJ】字符串识别和过滤
- POJ 3437 Tree Grafting
- xxx.hbm.xml文件配置解析
- Android自定义Content Provider实例
- 经验总结23--C#多线程和加锁
- Spring4的学习(三)
- Public Sale(巴什博弈)
- poj 1861(最小生成树)
- Dreamweaver批量替换,通配符替换(css)
- iOS: 学习笔记, Swift名字空间