二叉树-根据先序遍历和中序遍历得到后序遍历-java
问题描述:输入某二叉树的前序遍历和中序遍历的结果,得到后序遍历。
eg :输入样例:
DBACEGF ABCDEFG
BCAD CBAD
输出样例:
ACBFGED
CDAB
import java.util.Scanner; class TNode { public char value; public TNode(char s) { this.value = s; } } /** * 根据先序和中序得到后序 * @author NEU-2015 * */ public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); String str; String FirstOrder; //先序序列 String InOrder; //中序序列 String Last_String; //后序序列 while(input.hasNext()) { Last_String = ""; str = input.nextLine(); FirstOrder = str.split(" ")[0]; InOrder = str.split(" ")[1]; System.out.println(get_AfterOrder(FirstOrder, InOrder, 0, FirstOrder.length()-1, 0, InOrder.length()-1)); } } public static int count = 0; public static String get_AfterOrder(String FirstOrder, String InOrder, int first_Start, int first_End, int in_Start, int in_End) { String Last_String = ""; //后续序列字符 count++; TNode tree = new TNode(FirstOrder.charAt(first_Start)); if(first_Start == first_End && in_Start == in_End) { //表示该二叉树只有一个字符 return String.valueOf(tree.value); //返回仅有的一个字符 } int root = 0; //查找根节点在中序遍历中的位置 for(root = in_Start; root <= in_End; root++) { if(FirstOrder.charAt(first_Start) == InOrder.charAt(root)) { break; } } int next_leftChildTree_length = root - in_Start; //左子树长度 int next_rightChildTree_length = in_End - root; //右子数长度 if(next_leftChildTree_length > 0) { //递归左子树 Last_String += get_AfterOrder(FirstOrder, InOrder, first_Start+1, first_Start+next_leftChildTree_length, in_Start, root-1); } if(next_rightChildTree_length > 0) { //递归右子树 Last_String += get_AfterOrder(FirstOrder, InOrder, first_Start+1+next_leftChildTree_length, first_End, root+1, in_End); } Last_String += String.valueOf(FirstOrder.charAt(first_Start)); //加上根节点 return Last_String; } }