是否同一棵二叉搜索树(java实现)

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_38902950/article/details/80723168