标签:
这道题目不是很简单,第一反应可能是真的去构造出一棵树,然后递归遍历,比较两棵树的每个结点是否相同。
但这样子很麻烦,而且递归遍历的效率不高,我看到很多人用递归的方法最后超时无法通过。
我的方法是用静态数组模拟出二叉搜索树,根据二叉搜索树的特性,第i个节点的左孩子是第2*i个节点,右孩子是第2*i+1个节点,我们可以很方便地计算出每个节点的下标。
Java代码如下:
import java.util.*; public class Main{ public static void main(String args[]){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = Integer.parseInt(in.nextLine()); if(n == 0)break; int a[] = new int[512]; int b[] = new int[512]; String s = in.nextLine(); createTree(a,s); while(n > 0){ n--; String t = in.nextLine(); createTree(b,t); int i; for(i = 0; i < 512; i++){ if(a[i] != b[i]) break; } if(i == 512){ System.out.println("YES"); } else{ System.out.println("NO"); } } } in.close(); }
//这是核心函数,数组模拟一棵二叉搜索树 public static void createTree(int a[],String s){
//先把数组都初始化为-1 for(int i = 0; i < 512; i++) a[i] = -1;
//s是序列,我们要根据s构造出一棵树,先遍历s,每个字符对应一个节点 for(int i = 0; i < s.length(); i++){
//获得要添加的节点的数值temp int temp = s.charAt(i)-‘0‘;
//遍历数组,也即遍历二叉树 for(int j = 1; j < 512;){ //注意这里没有j++
//如果a[j]==-1,那么这个节点是空的,直接把temp存进去 if(a[j] == -1){ a[j] = temp; break; }
//如果不是空的,那么要往下找它的孩子节点,根据二叉搜索树的性质
//如果temp<a[j],那么temp应该在a[j]的左子树里,j=2*j接着遍历左子树
//如果temp>=a[j],那么temp应该在a[j]的右子树里,j=2*j+1,接着遍历右子树 else if(a[j] > temp) j = 2*j; else j = 2*j+1; } } } }
标签:
原文地址:http://www.cnblogs.com/mudao/p/5499418.html