题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
根据先序遍历的特点,第一个数字是根节点的值,可以通过它在中序遍历中的位置来确定左右子树,递归求解。
编写过程应注意在先序遍历中左右子树区分点的位置。
以下为代码:
// 根据先序、中序遍历重建二叉树
public static Node createTree(int preOrder[], int preStart, int preEnd, int inOrder[], int inStart, int inEnd) {
Node root = new Node();
int first = preOrder[preStart];
root.value = first;
if (preStart == preEnd) {
return root;
}
int rootIndex = inStart;
while (rootIndex < inEnd && inOrder[rootIndex] != first) {
rootIndex++;
}
int leftPreOrderEnd = preStart + (rootIndex - inStart);
if (rootIndex != inStart) {
root.left = createTree(preOrder, preStart + 1, leftPreOrderEnd, inOrder, inStart, rootIndex - 1);
}
if (rootIndex != inEnd) {
root.right = createTree(preOrder, leftPreOrderEnd + 1, preEnd, inOrder, rootIndex + 1, inEnd);
}
return root;
}