思路:给定前序遍历和中序遍历,首先可以从前序遍厉的第一个元素找到二叉树的头节点,通过头节点的值去中序遍历中找到对应位置,该位置记为index,index左侧为左子树,右侧为右子树,同时也知道了左右子树的节点个数,通过递归实现重构二叉树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null || preorder.length != inorder.length){
return null;
}
return constructor(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);//给递归传递参数
}
public TreeNode constructor (int[] preorder, int ps, int pe, int[] inorder, int is, int ie){ //ps,pe为前序遍历的首尾元素,is,ie为中序遍历的首尾元素
if (ps > pe){
return null;
}
int root = preorder[ps];
int index = is;
while (index <= ie && inorder[index] != root){//在中序遍历中找到头节点的位置index
index++;
}
if (index > ie){//如果没找到,无法重构二叉树
return null;
}
TreeNode node = new TreeNode();
node.val = root;
node.left = constructor(preorder, ps + 1, ps + index - is, inorder, is, index - 1);//递归左子树
node.right = constructor(preorder, ps + index - is + 1, pe, inorder, index + 1, ie);//递归右子树
return node;
}
}