概述在上一篇文章中讲到顺序存储二叉树,一般是用于完全二叉树,通过统一的数学公式可以将数组还原成完全二叉树
而对于普通的二叉树来说,也可以根据前序、中序和后序遍历得到的数组,还原二叉树
还原还原的情况分两种,分别是根据前序、中序和根据中序、后序
采用的二叉树如下图所示:
注意:前序和后序是没有办法还原二叉树
根据前序、中序还原二叉树如下图所示:
基本思路:根据前序数组,我们能够确定根节点(因为前序数组的根节点一定是第一个)
中序数组根据根节点能够确定左右子树的位置。(因为中序数组的根节点一定能够分开左右子树)
前序数组根据中序数组的左右子树的位置,也能够确定自己根节点的左右子树的位置(这部分可以看看代码怎么写的)
然后再分别递归左子树的前序、中序以及右子树的前序、中序,直到最后左右子树的长度都为0
代码如下:/**
* * @param pre 前序数组
* @param middle 中序数组
* @return 返回根节点
*/
public static TreeNode buildTree(int[] pre, int[] middle){
if (pre == null || middle == null || pre.length == 0 || middle.length == 0 || pre.length != middle.length)
return null;
//首先找到根节点
TreeNode root = new TreeNode(pre[0]);
//根据根节点的值找到中序遍历中的根节点的位置索引
int rootIndex = getIndex(middle, root.val);
if (rootIndex == -1)
return null;
//找到前序和中序中的左子树
//copyOfRange:拷贝[from, to)区间里的数据,左闭右开
int[] leftMiddle = Arrays.copyOfRange(middle, 0, rootIndex);
int[] leftPre = Arrays.copyOfRange(pre, 1, rootIndex + 1);