已經中序,後序,求先序。
java
先序的順序爲:先根節點,後左子樹,後右子樹。api
package whut.tree; //利用java api來進行遍歷 ////已知二叉樹後序和中序,求先序 public class MiddleAfterTree { //全局變量存放後序序列 //先寫根,後寫左子樹,最後寫右子樹 public static String res = ""; //兩個字符串是否包含了相同的字符 public static boolean StringEquals(String a1, String a2) { boolean state = true; if (a1.length() != a2.length()) { state = false; } if (a1.length() == a2.length()) { for (int i = 0; i < a1.length(); i++) { if (a2.indexOf(a1.charAt(i)) == -1) state = false; } } return state; } //進行遍歷輸出 //參數依此爲中序序列,後序序列 public static void cal_tree(String smid, String slast) { boolean state = StringEquals(smid, slast); if (state == false) return; if (smid.length() == 0) return; //每次添加都是添加中序的字符,當中序字符串長度爲1的時候,就返回 if (smid.length() == 1) { res += smid; return; } //後序序列中最後一個就是根 char root = slast.charAt(slast.length()-1); //獲取字符在中序序列總的位置 //mid表明的是索引 int mid = smid.indexOf(root); //中序序列的左子樹 String c=smid.substring(0, mid); //中序序列的右子樹 String d = smid.substring(mid+1); //寫入根 res += String.valueOf(root); //中序左子樹,後序左子樹 cal_tree(c,slast.substring(0, c.length())); //中序右子樹,後序右子樹,注意這裏後序的右子樹要最大爲slast.length()-1 cal_tree(d,slast.substring(c.length(),slast.length()-1)); return; } public static void main(String[] agrs) { //cal_tree("ADEFGHMZ","AEFDHZMG");=GDAFEMHZ //cal_tree("CDBEAGF","DCEBGFA");=ABCDEFG String s1 = "ADEFGHMZ"; String s2 = "AEFDHZMG"; cal_tree(s1, s2); if (res.length() != s1.length()) { System.out.println("wrong tree list!"); } else { System.out.println(res); } } }