描述:
给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
思路:
这道题考察的是二叉树根据先序、中序来重建二叉树的知识,这是数据结构二叉树部分的基础考点,清楚这个推导过程是先决条件。
1.递归(思想明确,代码简单)
想要重建一棵二叉树,得知道这棵树的先序和中序遍历序列,或者是中序和后序遍历序列,这是数据结构的基础知识。得知先序和中序,推导原二叉树,具体解题分为下面几步:
①先序遍历序列第一个节点一定为根节点;
②在中序遍历序列中找到这个根节点的位置;
③这个节点把中序序列分成了左右两部分,对应二叉树的左右子树,把这个子数组用java的库函数建立对应的子树;
④直到子树的序列长度为0,递归结束
代码实现:
public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
//1.递归
if (preOrder.length == 0 || vinOrder.length == 0) return null;
//构建根节点,先序遍历的第一个节点就是根节点
TreeNode root = new TreeNode(preOrder[0]);
for (int i=0;i < vinOrder.length;++i){
//在中序遍历里面找到先序的第一个元素
if (preOrder[0] == vinOrder[i]){
//构建左子树
root.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder,1,i+1),Arrays.copyOfRange(vinOrder,0,i));
//构建右子树
root.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder,i+1,preOrder.length),Arrays.copyOfRange(vinOrder,i+1,vinOrder.length));
break;
}
}
return root;
}