7-4 是否同一棵二叉搜索树(25 分)
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出样例:
Yes
No
No
结果测试点1通不过,提示是:"最大N,多组合"。如果哪位知道这个测试数据的,还望告知是忽略了哪种情况。
解决了,其实是insert函数写错了。每次插入应该是把整棵树的节点和要插入的数传进去,不需要返回值。而我以前是把上一次插入的节点和这一次要插入的数传进去,返回这次的节点,明显错了。
思路:
1、读入第一行第一个数据n,接着while循环,n!=0,继续读入,建树,之后读入下一组数据,如果n==0,退出循环。
2、把不同的序列都建成二叉搜索树,然后判断是否为同一棵树。
3、建树过程就是循环insert函数插入每一个节点。
4、insert函数用递归实现。
5、判断两棵二叉搜索树是否为一样,用compare函数,递归实现。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
T root = new T();
ArrayList<String> al = new ArrayList<>();
int n = in.nextInt();
if(n==0)
System.out.println("Yes");
while(n!=0) {
int m = in.nextInt();
root=build(in,n); //建树
for(int i = 0;i<m; i++) {
T demo = build(in,n);
al.add(judge(root,demo)); //根据序列建树,判断是否为同一棵二叉树
}
n = in.nextInt();
}
Iterator<String> it = al.iterator();
while(it.hasNext())
System.out.println(it.next());
}
private static String judge(T root, T demo) {
// TODO Auto-generated method stub
boolean bool = compare(root,demo);
if (bool==true)
return "Yes";
else
return "No";
}
private static boolean compare(T root, T demo) {
// TODO Auto-generated method stub
if(root==null&&demo==null)
return true;
else if((root==null&&demo!=null)||(root!=null&&demo==null))
return false;
else
{
if (root.element==demo.element)
return compare(root.left,demo.left)&&compare(root.right,demo.right);
else
return false;
}
}
private static T build(Scanner in,int n) {
// TODO Auto-generated method stub
T root = new T();
int head = in.nextInt();
root.element=head;
for( int i=1; i<n; i++ ) {
int num = in.nextInt();
insert(root,num);
}
return root;
}
private static void insert(T root, int num) {
// TODO Auto-generated method stub
if(num<root.element) {
if(root.left==null) {
T jd = new T();
jd.element=num;
root.left=jd;
}
else
insert(root.left,num);
}
else
{
if(root.right==null) {
T jd=new T();
jd.element=num;
root.right=jd;
}
else
insert(root.right,num);
}
}
}
class T{
public int element;
public T left =null;
public T right = null;
}