Problem C.二叉樹
題目描述
輸入二叉樹的前序遍歷和中序遍歷結果,輸出二叉樹的後序遍歷結果
輸入格式
第一行爲二叉樹先序遍歷結果
第二行爲二叉樹中序遍歷結果。
輸出格式
二叉樹後序遍歷結果。
Example
Inputs
426315
623415
Outputs
632514
import java.util.Scanner;
/*
Problem C.二叉樹
題目描述
輸入二叉樹的前序遍歷和中序遍歷結果,輸出二叉樹的後序遍歷結果
輸入格式
第一行爲二叉樹先序遍歷結果
第二行爲二叉樹中序遍歷結果。
輸出格式
二叉樹後序遍歷結果。
Example
Inputs
426315
623415
Outputs
632514
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
String dlr = scanner.next();
String ldr = scanner.next();
int[] DLR = new int[dlr.length()];
int[] LDR = new int[ldr.length()];
for(int i = 0; i < dlr.length(); i++) {
DLR[i] = dlr.charAt(i) - '0';
LDR[i] = ldr.charAt(i) - '0';
}
TreeNode root = reConstructBinaryTree(DLR, LDR);
LRD(root);
}
}
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root = reConstructBinaryTree(pre, 0, pre.length-1, in, 0, in.length-1);
return root;
}
public static TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn){//pre是前序遍歷,in是中序遍歷
if(startPre > endPre || startIn > endIn){
return null;
}
// 根據前序遍歷結果,創建根節點
TreeNode root = new TreeNode(pre[startPre]);
// 在中序遍歷的結果中找到根節點,找到其左右結點
//【4】 2 6 3 1 5
//6 2 3 【4】 1 5
for(int i = startIn; i <= endIn; i++){
if(in[i] == pre[startPre]){
root.left = reConstructBinaryTree(pre, startPre+1, startPre+i-startIn, in, startIn, i-1); //左孩子是中序遍歷根節點左子樹的根節點
root.right = reConstructBinaryTree(pre, i-startIn+startPre+1, endPre, in, i+1, endIn);//右孩子是中序遍歷根節點右子樹的根節點
}
}
return root;
}
public static void LRD(TreeNode head) {
if(head.left != null) LRD(head.left);
if(head.right != null) LRD(head.right);
System.out.print(head.val);
}
}