题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
程序:
public class Solution {
public static void main(String[] args) {
int[] pre = {1,2,3,4,5,6,7};
int[] in = {3,2,4,1,6,5,7};
TreeNode root = reConstructBinaryTree(pre, in);
print(root);
}
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
return construct(pre, in, 0, 0, pre.length - 1);
}
private static TreeNode construct(int[] pre, int[] in, int index, int l, int r) {
int inIndex;
if (index >= pre.length || (inIndex = indexOf(pre[index], in)) < l || inIndex > r)
return null;
TreeNode pNode = new TreeNode(pre[index]);
pNode.left = construct(pre, in, index + 1, l, inIndex - 1);
pNode.right = construct(pre, in, index + inIndex - l + 1, inIndex + 1, r);
return pNode;
}
private static int indexOf(int target, int[] arr) {
for (int i = 0; i < arr.length; i++) {
if (target == arr[i])
return i;
}
return -1;
}
//节点
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public static void print(TreeNode p) {
System.out.print(p.val + " ");
if (p.left != null)
print(p.left);
if (p.right != null)
print(p.right);
}
}