SJTU--1040 -- 二叉树层次遍历
来源:互联网 发布:陕西省广电网络网址 编辑:程序博客网 时间:2024/05/16 09:57
1040. 二叉树层次遍历
Description
给出一棵二叉树,求它的层次遍历结果。
[二叉树的遍历问题是一种精神,务必领会]
Input Format
第一行,N<1000000,表示二叉树节点数。
默认序号为0的节点为树根。接下来共N-1行,依次表示序号为1,...,N-1的节点的父亲节点序号。
如果一个节点有两个孩子节点,左孩子节点序号总是小于右孩子节点序号。
Output Format
仅一行,二叉树的层次遍历结果。节点序号间用空格隔开。
Hint
Sample Input
601104
Sample Output
0 1 4 2 3 5
Code:
第一次超时的
由于直接分配了一个超大的数组, 再根据数组中的数据逐个查找, 循环次数造成的时间复杂度那么大, 结果超时是必须的
#include"stdio.h"//超时代码,下面附的是正确AC的#include"stdlib.h"#include"queue"#include"iostream"using namespace std;int tree[1000010];int print[1000010];int n;//n个结点 queue <int> out; void Traverse(int tree[]){int i=0,j,num=0,pi=1,e;out.push(i);//0入队for(j=1;j<=n;j++) {num = 0;e = out.front(); //出队一个元素并寻找以该元素为父节点的结点 out.pop();//printf("e:%d \n",e);for(i=1;i<n;i++)//从0下标开始循环,父节点为i的入队并输出 {if(num==2) break;//两个子树 if(tree[i]==e){//printf("----\n");out.push(i);//printf("back:%d \n",out.back());print[pi++] = i;//printf("print:%d \n",print[pi-1]);num++; } }}} int main(){ int i;while(scanf("%d",&n)!=EOF){for(i=1;i<n;i++)scanf("%d",&tree[i]);//用数组存放父结点,下标代表结点元素 //for(i=0;i<n;i++)//print[i] = 0;print[0] = 0;Traverse(tree);for(i=0;i<n-1;i++)//输出 printf("%d ",print[i]);printf("%d\n",print[n-1]); }return 0;}
第二次答案错误
手贱写错了数组下标, 楞了半天
第三次终于通过了,激动的泪流满面啊
#include"stdio.h"#include"stdlib.h"#include"queue"#include"iostream"using namespace std;int tree[1000010][2];int print[1000010]; int n;//n个结点queue <int> out;void Traverse(int tree[][2]){int e;e = 0;out.push(e);//先把0入队 while(n--) //n次循环 {if(tree[e][0] != -1) out.push(tree[e][0]);//不为-1则入队 if(tree[e][1] != -1) out.push(tree[e][1]);printf("%d",out.front());//输出队头元素 if(n>0) printf(" "); out.pop();//出队已输出元素 e = out.front(); //e赋值为当前队头元素 }printf("\n");}int main(){ int i,temp;while(scanf("%d",&n)!=EOF){for(i=0;i<n;i++)//因为只可能有两颗子树, 所以如果输入的父亲结点相同的话,tree[i][0] = tree[i][1] = -1; //放在这两个位置里面以节约时间 for(i=1;i<n;i++)//用数组存放父结点,下标代表结点元素{scanf("%d",&temp);if(tree[temp][0] == -1){tree[temp][0] = i;}else//该父亲节点已经有一个孩子结点 {if(temp>tree[temp][0])//与已有结点比较大小,0位置放较小结点 {tree[temp][1] = tree[temp][0];tree[temp][0] = i;}tree[temp][1] = i; } }//输入for//for(i=0;i<n;i++)//printf("%d:%d %d\n",i,tree[i][0],tree[i][1]);Traverse(tree);}return 0;}
- SJTU--1040 -- 二叉树层次遍历
- 二叉树的层次遍历(相当于广度遍历) SJTU OJ 题目 1040二叉树层次遍历
- 层次遍历二叉树
- 层次遍历二叉树
- 二叉树层次遍历
- 二叉树 层次遍历
- 二叉树层次遍历
- 层次遍历二叉树
- 二叉树层次遍历
- 层次遍历二叉树
- 二叉树层次遍历
- 二叉树层次遍历
- 层次遍历二叉树
- 二叉树层次遍历
- 二叉树层次遍历
- 层次遍历 二叉树
- 层次遍历二叉树
- 层次遍历二叉树
- My first APP
- xcode升级svn到1.8版本
- RTSP点播消息流程实例(客户端:VLC, RTSP服务器:LIVE555 Media Server)
- 最简实例说明wait、notify、notifyAll的使用方法
- dataGridView获取当前行的第一个单元格的值的方法
- SJTU--1040 -- 二叉树层次遍历
- VisionMobile:2013年Q3移动开发者经济报告(九):第八章、开发者收入模式:巧克力盒子
- 如何才能成为优秀的产品经理(一)
- 窗口站&桌面
- Magento: 移除分类列表的排序Sort by下拉列表里面的第一个选项:position
- Mysql批量插入随机数据改进版_设置表主键为自增,免得主键冲突
- MongoDB常用方法
- 有向无环图两点之间的路径数目(算法导论22.4-2)
- SDJZU 出租车费