【题目】根据二叉树中序和后序(先序)遍历结果 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回
【思路】
根据中序和先序结果 重建二叉树
1.前序结果第一个非空节点为root节点,然后在中序结果中找个根节点,则左侧为左子序列,右侧为右子序列
2.根据左子序列长度,去前序结果中找出前序左子序列和右子序列
3.递归上述步骤,直至空子序列结束
根据中序和后序结果重建二叉树与上述类似
【根据中序和先序结果重建】
/**
* 根据中序和先序结果 重建二叉树
* 1.前序结果第一个非空节点为root节点,然后在中序结果中找个根节点,则左侧为左子序列,右侧为右子序列
* 2.根据左子序列长度,去前序结果中找出前序左子序列和右子序列
* 3.递归上述步骤,直至空子序列结束
*
* @param pre
* @param startPre
* @param endPre
* @param in
* @param startIn
* @param endIn
* @return
*/
public static TreeNode reconstruct1(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {
if (startPre > endPre || startIn > endIn) {
return null;
}
//重建根结点
TreeNode root = new TreeNode(pre[startPre]);
//根据root.val 在中序序列中确定根结点的位置下标i;
for (int i = startIn; i < in.length; i++) {
if (in[i] == root.val) {
//左子树序列:i - startIn为左子树序列元素个数,左子序列在pre中索引位置为【startPre + 1, startPre + i - startIn】
root.left = reconstruct1(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);
//右子树序列:右子序列在pre中索引位置为【startPre + i - startIn + 1, endPre】
root.right = reconstruct1(pre, startPre + i - startIn + 1, endPre, in, i + 1, endIn);
}
}
return root;
}
【根据中序和后序结果重建】
/**
* 根据中序和后序结果 重建二叉树
* 1.后序结果最后一个非空节点为root节点,然后在中序结果中找到根节点,则左侧为左子序列,右侧为右子序列
* 2.根据左子序列长度,去前序结果中找出前序左子序列和右子序列
* 3.递归上述步骤,直至空子序列结束
*
* @param post
* @param startPost
* @param endPost
* @param in
* @param startIn
* @param endIn
* @return
*/
public static TreeNode reconstruct2(int[] post, int startPost, int endPost, int[] in, int startIn, int endIn) {
if (startPost > endPost || startIn > endIn) {
return null;
}
//重建根结点
TreeNode root = new TreeNode(post[startPost]);
//根据root.val 在中序序列中确定根结点的位置下标i;
for (int i = startIn; i < in.length; i++) {
if (in[i] == root.val) {
//左子树序列:i - startIn为左子树序列元素个数,左子序列在pre中索引位置为【startPost, startPost + i - startIn -1】
root.left = reconstruct2(post, startPost, startPost + i - startIn - 1, in, startIn, i - 1);
//右子树序列:右子序列在pre中索引位置为【startPost + i - startIn, endPost -1 】
root.right = reconstruct2(post, startPost + i - startIn, endPost - 1, in, i + 1, endIn);
}
}
return root;
}