PAT研究生入学考试2015.03第四题Build A Binary Search Tree (30) 题解
2015-09-21 16:34
435 查看
题目:http://www.patest.cn/contests/pat-a-practise/1099
题目可以分为四个步骤:建树,排序,中序遍历,层次遍历
建树就是输入,注意把双亲域也填上,后边中序遍历如果是非递归的话要用到。
然后将输入的数据序列从小到大排好序,这样在中序遍历的时候就只要一个一个填进去就好了。
中序遍历我用的是树操作中常见的求下一个节点的运算,是非递归的。
层次遍历我用的是队列,或者说广度优先搜索。
整体来看这题也就是稍微麻烦一些,并不难。
题目可以分为四个步骤:建树,排序,中序遍历,层次遍历
建树就是输入,注意把双亲域也填上,后边中序遍历如果是非递归的话要用到。
然后将输入的数据序列从小到大排好序,这样在中序遍历的时候就只要一个一个填进去就好了。
中序遍历我用的是树操作中常见的求下一个节点的运算,是非递归的。
层次遍历我用的是队列,或者说广度优先搜索。
整体来看这题也就是稍微麻烦一些,并不难。
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; //1ms 360kb const int MAXN=110; struct Node { int value; Node* l,*r,*p; }nodes[MAXN]; int n; Node* nextNode(Node* now) { if (now->r){ now=now->r; while (now->l) now=now->l; return now; } while (now->p!=NULL && now==now->p->r) now=now->p; return now->p; } void printTree(Node* root) { Node* dl[MAXN]; int h=0,t=0,coun=0; dl[h]=root; while (h<=t) { if (++coun==n) printf("%d",dl[h]->value); else printf("%d ",dl[h]->value); if (dl[h]->l!=NULL) dl[++t]=dl[h]->l; if (dl[h]->r!=NULL) dl[++t]=dl[h]->r; h++; } } int main() { scanf("%d",&n); for (int i=0;i<n;i++) { int a,b; scanf("%d%d",&a,&b); if (a==-1) nodes[i].l= NULL; else { nodes[i].l=&nodes[a]; nodes[a].p=&nodes[i]; } if (b==-1) nodes[i].r= NULL; else { nodes[i].r=&nodes[b]; nodes[b].p=&nodes[i]; } } int a[MAXN]; for (int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); Node* now=&nodes[0]; while (now->l) now=now->l; for (int i=0;i<n;i++) { now->value=a[i]; now=nextNode(now); } printTree(&nodes[0]); return 0; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#数据结构揭秘一
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 数据结构之Treap详解
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总