leetcode105从前序与中序遍历序列构造二叉树
题目详情
题目分析
首先由前序遍历的性质可以得出,前序遍历序列的第一个数即为二叉树的根节点,通过根节点在中序遍历中查找根节点的位置,中序遍历序列中,根节点左侧为左子树的中序遍历,右侧为右子树的中序遍历。根据左子树的节点个数可以在前序遍历序列中找出左右子树的分界点,然后利用递归方法,生成左右子树。
public class Solution2 {
public TreeNode buildTree(int[] preorder, int[] inorder){
if(preorder.length != inorder.length)
return null;
if(preorder.length == 0)
return null;
if(preorder.length == 1)
return new TreeNode(preorder[0]);
return buildTree(preorder, inorder, 0, preorder.length - 1, 0, inorder.length -1);
}
private TreeNode buildTree(int[] preorder, int[] inorder, int prei, int prej, int ini, int inj){
if(prei > prej || ini > inj || prei < 0 || prej >= preorder.length || ini < 0 || inj >= inorder.length)
return null;
if(prej - prei < 0)
return null;
if(prei == prej)
return new TreeNode(preorder[prei]);
TreeNode root = new TreeNode(preorder[prei]);
int inFlag = 0;
for(int i = ini; i <= inj; i ++){
if(inorder[i] == root.val){
inFlag = i;
break;
}
}
int num_left = inFlag - ini;
int num_right = inj - inFlag;
root.left = buildTree(preorder, inorder, prei + 1, prei + num_left, ini, inFlag - 1);
root.right = buildTree(preorder, inorder, prej - num_right + 1, prej, inFlag + 1, inj);
return root;
}
}