二叉樹的前序、中序、後序遍歷的定義: 前序遍歷:對任一子樹,先訪問跟,而後遍歷其左子樹,最後遍歷其右子樹; 中序遍歷:對任一子樹,先遍歷其左子樹,而後訪問根,最後遍歷其右子樹; 後序遍歷:對任一子樹,先遍歷其左子樹,而後遍歷其右子樹,最後訪問根。 給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷(提示:給定前序遍歷與中序遍歷可以惟一肯定後序遍歷)。 變量條件:二叉樹中的結點名稱以大寫字母表示:A,B,C....最多26個結點。 運行時限:1秒/測試數據。 輸入格式:兩行,第一行爲前序遍歷,第二行爲中序遍歷。 輸出格式:若不能根據前序和中序遍歷求出後序遍歷,輸出NO ANSWER;不然輸出一行,爲後序遍歷。
/** * 前序遍歷:GDAFEMHZ * 中序遍歷:ADEFGHMZ * * * 兩個步驟: 根據前序中序,構造二叉樹 後序遍歷二叉樹 * 根據前序遍歷的特色得知,根結點爲G * 根結點將中序遍歷結果ADEFGHMZ分紅ADEF和HMZ兩個左子樹、右子樹。 * 遞歸肯定中序遍歷序列ADEF和前序遍歷序列DAFE的子樹結構; * 遞歸肯定中序遍歷序列HMZ和前序遍歷序列MHZ的子樹結構; */ public class PostOrder{ public static void main(String[] args) throws Exception{ // Scanner in = new Scanner(System.in); // String pre,mid; // while(in.hasNext()){ // pre = in.next(); // mid = in.next(); // System.out.println(postOrder(pre,mid)); // } String pre = "ABDGCEFH"; String mid = "DGBAECHF"; System.out.println(postOrder(pre,mid)); } private static String postOrder(String pre, String mid) throws Exception{ if(pre.length() == 1) return pre; else if(pre.length() == 0) return ""; int m = mid.indexOf(pre.charAt(0)); return postOrder(pre.substring(1,m+1 ),mid.substring(0, m)) + postOrder(pre.substring(m+1),mid.substring(m+1)) + pre.charAt(0); } }
/** * 中序遍歷:ADEFGHMZ * 後序遍歷:AEFDHZMG * * * 後序遍歷最後一個結點即爲根結點,即 根結點爲G */ public class PreOrder { public static void main(String[] args) throws Exception{ String post = "AEFDHZMG"; String mid = "ADEFGHMZ"; System.out.println(preOrder(post,mid)); } private static String preOrder(String post, String mid) throws Exception{ if(post.length() == 1) return post; else if(post.length() == 0) return ""; int m = mid.indexOf(post.charAt(post.length() - 1)); return post.charAt(post.length() - 1) + preOrder(post.substring(post.length() - mid.length(),m),mid.substring(0,m)) + preOrder(post.substring(m,post.length() - 1),mid.substring(m+1)); } }