SJTU--1040 -- 二叉树层次遍历

2024-06-10 13:32

本文主要是介绍SJTU--1040 -- 二叉树层次遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

1040. 二叉树层次遍历

Description

给出一棵二叉树,求它的层次遍历结果。

[二叉树的遍历问题是一种精神,务必领会]

Input Format

第一行,N<1000000,表示二叉树节点数。

默认序号为0的节点为树根。接下来共N-1行,依次表示序号为1,...,N-1的节点的父亲节点序号。

如果一个节点有两个孩子节点,左孩子节点序号总是小于右孩子节点序号。

Output Format

仅一行,二叉树的层次遍历结果。节点序号间用空格隔开。

Hint

Sample Input

6
0
1
1
0
4

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 -- 二叉树层次遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048294

相关文章

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具

hashmap的存值,各种遍历方法

package com.jefflee;import java.util.HashMap;import java.util.Iterator;import java.util.Map;public class HashmapTest {// 遍历Hashmap的四种方法public static void main(String[] args) {//hashmap可以存一个null,把

Knight Moves -uva 简单的BFS遍历

昨天刚学了BFS的遍历,在uva上找了个题敲了出来,感觉还不错,最近敲代码挺有手感的,希望这种状态保持下去 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 10 + 5#define LEN 100 + 10using namespace std;in

Transportation-POJ 1040

DFS练习题,直接暴力吧,600+MS过的。。。。不能DP,有后效性,还有以后少用memcpy了,复杂度好大。。。。。 #include<cstdio>#include<cstring>#include<iostream>using namespace std;int max_size,n,m;#define MAXD 100 + 10#define max(a,b) (a >

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ