前序中序求後序的java算法

二叉樹的前序、中序、後序遍歷的定義:
前序遍歷:對任一子樹,先訪問跟,而後遍歷其左子樹,最後遍歷其右子樹;
中序遍歷:對任一子樹,先遍歷其左子樹,而後訪問根,最後遍歷其右子樹;
後序遍歷:對任一子樹,先遍歷其左子樹,而後遍歷其右子樹,最後訪問根。
給定一棵二叉樹的前序遍歷和中序遍歷,求其後序遍歷(提示:給定前序遍歷與中序遍歷可以惟一肯定後序遍歷)。
變量條件:二叉樹中的結點名稱以大寫字母表示: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));
    }

}
相關文章
相關標籤/搜索