1. 本题知识点
树
2. 题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如:
Input
前序遍历序列:{1, 2, 4, 7, 3, 5, 6, 8}
中序遍历序列:{4, 7, 2, 1, 5, 3, 8, 6}
Output
返回重建二叉树
3. 解题思路
- 前序遍历序列的第一结点是 1 ,它就是这个二叉树的根节点
-
使用这个根节点将中序遍历序列分成两部分,左部分为二叉树的左子树中序遍历结果,右部分为二叉树的右子树中序遍历的结果。
-
使用左子树中序遍历结果将前序遍历序列分为两个部分,左部分为二叉树的左子树前序遍历结果,右部分为二叉树的右子树前序遍历的结果。
-
现在我们已经有了左右子树中序遍历结果和左右子树前序遍历结果,然后分别对左右子树进行递归就行了。
4. 代码
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
/**
* 输入二叉树的前序遍历和中序遍历的结果,返回该二叉树
* @param pre 前序遍历数组
* @param in 中序遍历数组
* @return
*/
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
if (pre.length == 0 || in.length == 0) {
return null;
}
// 生成根结点
TreeNode treeNode = new TreeNode(pre[0]);
// 获得 in 数组中根结点的坐标
int indexOfIn = 0;
for (int i = 0; i < in.length; i++) {
if(pre[0] == in[i]) {
indexOfIn = i;
break;
}
}
// 左子树 in 数组
int[] inLeft = Arrays.copyOfRange(in, 0, indexOfIn);
// 右子树 in 数组
int[] inRight = Arrays.copyOfRange(in, indexOfIn + 1, in.length);
// 左子树 pre 数组
int[] preLeft = Arrays.copyOfRange(pre, 1, indexOfIn + 1);
// 右子树 pre 数组
int[] preRight = Arrays.copyOfRange(pre, indexOfIn + 1, pre.length);
// 设置左子树
treeNode.left = reConstructBinaryTree(preLeft, inLeft);
// 设置右子树
treeNode.right = reConstructBinaryTree(preRight, inRight);
return treeNode;
}
}