题意理解
这是一道非常经典的题目。中序遍历的顺序是:左根右,后序遍历的顺序是左右根。由于我们构造节点的时候,一个是需要有这个节点的值,一个是需要左右子节点,那么就显然要借助后序遍历的根来赋值,并借助中序遍历的左和后序遍历的左来构建左子节点。同理,构建右子节点。
代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Node {
char value;
Node left;
Node right;
public void print() {
System.out.print(value);
if(left != null) {
left.print();
}
if(right != null) {
right.print();
}
}
public Node(String mid, String back) {
char root = back.charAt(back.length() - 1);
this.value = root;
if(mid.length() == 1) {
return;
}
for(int i = 0; i < mid.length(); i++) {
if(mid.charAt(i) == root) {
int len = i;
String midLeft = mid.substring(0, len);
String midRight = mid.substring(len + 1);
String backLeft = back.substring(0, len);
String backRight = back.substring(len, mid.length() - 1);
if(midLeft.length() > 0) {
Node lc = new Node(midLeft, backLeft);
this.left = lc;
}
if(midRight.length() > 0) {
Node rc = new Node(midRight, backRight);
this.right = rc;
}
break;
}
}
}
}
public class Main {
public static class FastScanner {
private BufferedReader br;
private StringTokenizer st;
public FastScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
public String nextToken() {
while(null == st || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (Exception e) {
}
}
return st.nextToken();
}
public int nextInt() {
return Integer.valueOf(nextToken());
}
}
static String mid, back;
public static void main(String[] args) {
FastScanner fs = new FastScanner();
mid = fs.nextToken();
back = fs.nextToken();
Node root = new Node(mid, back);
root.print();
}
}