今天刷了一下二叉树的题,刷到了重建二叉树,题是这样的:
给出二叉树的先序和中序遍历序列,重建该二叉树。
一说到二叉树的题,我们都知道递归是用得最多的,比如二叉树的前中后序遍历,用递归特别简单易懂。所以碰到二叉树的题,我们可以先用递归思路思考下,果不其然,这道题递归同样也适用,接下来讲解一下递归的思想:
-
首先可以用list存储中序遍历数组的元素,用它存储的原因在于,后面可以查询下标;
-
第二步, 从前序遍历数组中取出第一个元素,我们都知道它是根结点,所以二叉树的根结点就找到了;记录此时根结点的索引index,设置前序数组索引pos,往后继续走;
-
开始递归过程,根结点的左子树就在区间list.subList(0,index),根结点的右子树的区间为list.subList(index+1,inorder.length)。
代码如下:
public TreeNode buildTree1(int[] preorder, int[] inorder) {
if (preorder.length == 0) {
return null;
}
List<Integer> list = new ArrayList<>();
for (int x:inorder){
list.add(x);
}
return Helper(preorder,list);
}
int pos = 0;
private TreeNode Helper(int[] preorder, List<Integer> list) {
if (preorder.length == 0) {
return null;
}
TreeNode root = new TreeNode(preorder[pos]);
int index = list.indexOf(root.val);
pos++;
root.left = Helper(preorder,list.subList(0,index));
root.right = Helper(preorder,list.subList(index+1,preorder.length));
return root;
}