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);
}
}