题目内容:
7-12 关于堆的判断 (25分)
将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种:
x is the root:x是根结点;
x and y are siblings:x和y是兄弟结点;
x is the parent of y:x是y的父结点;
x is a child of y:x是y的一个子结点。
输入格式: 每组测试第1行包含2个正整数N(≤ 1000)和M(≤ 20),分别是插入元素的个数、以及需要判断的命题数。下一行给出区间[−10000,10000]内的N个要被插入一个初始为空的小顶堆的整数。之后M行,每行给出一个命题。题目保证命题中的结点键值都是存在的。输出格式: 对输入的每个命题,如果其为真,则在一行中输出T,否则输出F。
输入样例: 5 4 46 23 26 24 10 24 is the root 26 and 23 are siblings 46 is
the parent of 23 23 is a child of 10输出样例: F T F T
大致思路:
思路就是按输入的顺序构建小根堆,然后对输入的命题进行判断,在这里我是用java的字符串匹配函数来对输入的命题进行判断的;做的时候出现一些问题,我刚开始是把给定的数据输入到一个顺序存储结构的二叉树数组中,然后下滑进行调整,提交之后发现只对了一半;后来网上查了一些别人的做法,才发现题目要求
将一系列给定数字顺序插入一个初始为空的小顶堆H[]。
所以修改成在输入的时候对数据进行上滑调整,提交才通过了。
总结:
总结就是自己对于堆的创建还是不熟悉,然后就是读题不够仔细。
上代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static void heap(int a[],int index)
{
int temp=a[index];
int i=(index-1)/2;
while(index>0)//i为parent
{
if(a[i]>temp)
{
a[index]=a[i];
index=i;
i=(i-1)/2;
}
else break;
}
a[index]=temp;
}
public static void main(String[] args) {
boolean sel;
String s;
int n,m,x,y,temp,p;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++)
{
a[i]=sc.nextInt();
heap(a,i);
}
s=sc.nextLine();
for(int i=0;i<m;i++)
{
s=sc.nextLine();
if(s.indexOf("root")!=-1)
{
x=Integer.parseInt(s.substring(0,s.indexOf(" ")));
if(a[0]==x)
System.out.println("T");
else
System.out.println("F");
continue;
}
if(s.indexOf("siblings")!=-1)
{
int i1=0,i2=0;
x=Integer.parseInt(s.substring(0,s.indexOf(" ")));
y=Integer.parseInt(s.substring(s.indexOf("and")+4,s.indexOf("are")-1));
for(int j=0;j<n;j++)
{
if(a[j]==x)
{
/*if((j%2!=0 && (j+1)<n && a[j+1]==y) || (j%2==0 && (j-1)>0 && a[j-1]==y))
System.out.println("T");
else
System.out.println("F");
break;*/
i1=j;
}
if(a[j]==y)i2=j;
}
if((i1-1)/2==(i2-1)/2)System.out.println("T");else System.out.println("F");
continue;
}
sel=false;
if(s.indexOf("child")!=-1)sel=true;;
if(s.indexOf("parent")!=-1 || sel)
{
x=Integer.parseInt(s.substring(0,s.indexOf(" ")));
y=Integer.parseInt(s.substring(s.lastIndexOf(" ")+1));
if(sel) {
temp=x;
x=y;
y=temp;
}
for(int j=0;j<n;j++)
{
if(a[j]==x)
{
if(((j*2+1)<n && a[j*2+1]==y) || ((j*2+2)<n && a[j*2+2]==y))
System.out.println("T");
else
System.out.println("F");
break;
}
}
continue;
}
}
//System.out.println("a="+Arrays.toString(a));
}
}
运行截图: