描述: | 判斷兩序列是否為同一二叉搜尋樹序列 |
題目類别: | 樹 |
難度: | 中級 |
運作時間限制: | 10Sec |
記憶體限制: | 128MByte |
階段: | 入職前練習 |
輸入: | 開始一個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。 接下去一行是一個序列,序列長度小于10,包含(0~9)的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。 接下去的n行有n個序列,每個序列格式跟第一個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜尋樹。 |
輸出: | 如果序列相同則輸出YES,否則輸出NO |
樣例輸入: | |
樣例輸出: | |
也不知道這種思路對不對,反正平台上是過了。看到網上大家的普遍做法是比較他的前序序列,如果一緻就是相同
我自己的解決思路是,将要比較的字元串和第一個字元串分隔。比第一個數字大的組成一個子串,比第一個數字小的組成一個子串。組成子串的時候和原串順序相同。
比較子串。如果都相同,那就是同一個樹
import java.util.*;
public class Main {
public static void main(String args[]){
isSameTree();
}
public static void isSameTree(){
Scanner s= new Scanner(System.in);
//判斷個數
int num = Integer.valueOf(s.nextLine());
//第一個序列
String firstTreeStr = s.nextLine();
//得到第一個序列的兩個子串,第一個子串全部小于串中第一個數字,第二個子串全部大于第一個數字,順序和原串相同
String subFirstTreeStrSmall = devideTree( firstTreeStr,1);
String subFirstTreeStrBig = devideTree( firstTreeStr,2);
// System.out.println(subFirstTreeStrSmall);
// System.out.println(subFirstTreeStrBig);
String treeStr = s.nextLine();
String subTreeStrSmall = devideTree( treeStr,1);
String subTreeStrBig = devideTree( treeStr,2);
ArrayList res = new ArrayList();
while(!treeStr.equals("0")){
if(subTreeStrSmall.equals(subFirstTreeStrSmall)&&subTreeStrBig.equals(subFirstTreeStrBig))
res.add("YES");
//System.out.println("YES");
else res.add("NO");//System.out.println("NO");
treeStr = s.nextLine();
subTreeStrSmall = devideTree( treeStr,1);
subTreeStrBig = devideTree( treeStr,2);
}
for(int i=0;i<num;i++){
System.out.println(res.get(i));
}
}
//分隔串函數,int i 代表,子串大于或小于第一個數字i小于,2大于
public static String devideTree(String treeStr,int i){
String subStr = "";
int length = treeStr.length();
int firstStr = Integer.valueOf(treeStr.charAt(0)+"");
if(i==1){
for(int x = 1;x<length;x++){
int nextStr = Integer.valueOf(treeStr.charAt(x)+"");
if(nextStr<firstStr)
subStr+=nextStr;
}
}else if(i==2){
for(int x = 1;x<length;x++){
int nextStr = Integer.valueOf(treeStr.charAt(x)+"");
if(nextStr>firstStr)
subStr+=nextStr;
}
}
return subStr;
}
}