题目:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
前序遍历第一个数字就是根节点的值m,然后在中序遍历结果中,在m左侧即为m的左子树,右侧即为右子树。这样,我们就在前序遍历和中序遍历两个序列中分别找到了左右子树对应的子序列。通过递归,即可构建该二叉树。
public class MS7 {
public static BinaryNode rebuildBinaryTree(int preorder[], int inorder[]) {
if (preorder == null || inorder == null) { //如果前序或者中序有一个是空直接返回
return null;
}
// 定义构建二叉树的核心算法
BinaryNode root = rebuildBinaryTreeCore(preorder, 0, preorder.length - 1,
inorder, 0, inorder.length - 1);
return root;
}
// 构建二叉树的核心算法
public static BinaryNode rebuildBinaryTreeCore(int preorder[], int startPreorder,
int endPreorder, int inorder[], int startInorder, int endInorder) {
if (startPreorder > endPreorder || startInorder > endInorder) { //停止递归的条件
return null;
}
BinaryNode root = new BinaryNode(preorder[startPreorder]);
for (int i = startInorder; i <= endInorder; i++) {
if (preorder[startPreorder] == inorder[i]) {
// 其中(i - startInorder)为中序排序中左子树结点的个数
//左子树
root.leftChild = rebuildBinaryTreeCore(preorder, startPreorder + 1,
startPreorder + (i - startInorder), inorder,
startInorder, i - 1);
//右子树
root.rightChild = rebuildBinaryTreeCore(preorder, (i - startInorder)
+ startPreorder + 1, endPreorder, inorder, i + 1,
endInorder);
}
}
return root;
}
}