(1)P4715 【深基16.例1】淘汰赛
这题好像不用二叉树来做,直接把数据一分为二,找到左边的最大值和右边的最大值,然后二者小的就是亚军,把它的下标输出即可。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int x=sc.nextInt(),n=1;
while(x-->0) {
n*=2;
}
int sum1=0,sum2=0,index1=0,index2=0;
for(int i=0;i<n/2;i++) {
int num=sc.nextInt();
if(sum1<num) {
sum1=num;
index1=i;
}
}
for(int i=n/2;i<n;i++) {
int num=sc.nextInt();
if(sum2<num) {
sum2=num;
index2=i;
}
}
if(sum1>sum2) {
System.out.println(index2+1);
}
else {
System.out.println(index1+1);
}
}
}
(2)
这道题考察树的遍历,先用一个树的数组把各个结点的关系存下来,然后进行dfs遍历,每到下一层,层数加1。但这题对java不友好,因为java递归的深度是有限制的,所以有两个点过不了。
import java.util.Scanner;
public class Main {
static tree[] t=new tree[1000005];
static int max=0;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
t=new tree[1000005];
for(int i=0;i<t.length;i++) {
t[i]=new tree();
}
for(int i=1;i<=n;i++) {
t[i].left=sc.nextInt();
t[i].right=sc.nextInt();
}
dfs(1,0);
System.out.println(max);
}
public static void dfs(int id,int deep) {
if(id==0) {
max=Math.max(deep, max);
return;
}
dfs(t[id].left,deep+1);
dfs(t[id].right,deep+1);
}
}
class tree{
int left,right;
}
(3)P1827 [USACO3.4]美国血统 American Heritage
一个树的基本练习,首先要知道前序遍历的第一个结点是根结点,然后通过根节点可以把中序遍历分为左子树和又子树,然后递归的进行,直到叶子结点,然后输出。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String a=sc.nextLine();
String b=sc.nextLine();
dfs(a,b);
}
public static void dfs(String a,String b) {
if(b.length()==0) return;
int index=a.indexOf(b.charAt(0));
dfs(a.substring(0,index),b.substring(1,index+1));
dfs(a.substring(index+1),b.substring(index+1));
System.out.print(b.charAt(0));
}
}
(4)