Java已知二叉樹的中序後序求先序序列

已經中序,後序,求先序。
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);
        }
    }
}
相關文章
相關標籤/搜索