给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。
在本科的数据结构课里经常会看到的题目,给定前序和中序遍历后重构二叉树,如果是用笔纸写的话很容易想明白:首先前序中的第一个节点就是树根,中序中该节点左面的都是其左子树,右面的都是右子树,接着再寻找。其实这个过程就是递归的过程,将改过程改为代码即可。
import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre == null || pre.length == 0) {
return null;
}
// 前序遍历的首元素就是当前递归层次的根节点
int rootVal = pre[0];
// 当前长度为1,直接返回,表示已经递归到最右叶子节点
if(pre.length == 1) {
return new TreeNode(rootVal);
}
int rootIndex = 0;
// 确定左右子树的范围
for(int i = 0; i < in.length; i++) {
if(rootVal == in[i]) {
// 中序遍历数组中根节点的索引
rootIndex = i;
break;
}
}
TreeNode root = new TreeNode(rootVal);
// 左右分别递归区间,分别得到左右区间的根节点作为上次根节点的左右子结点
// copyOfRange为左闭右开 [), 即包括左界限不包括右界限
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, rootIndex + 1), Arrays.copyOfRange(in, 0, rootIndex));
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, rootIndex + 1, pre.length), Arrays.copyOfRange(in, rootIndex + 1, in.length));
return root;
}
}