根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
必须要掌握两种遍历方式,理解了构造规律就简单了,来看这一题,前序遍历中第一个3肯定是root,后面9,20,15,7中有一部分是3的左子树,剩下的就是柚子树,而这个部分可由中序遍历来确定,中序遍历为左中右,中是3,所以左为9,右为15,20,7。我们只需得到3左侧长度为1,然后截取前序遍历中9,20,15,7前一位为左,剩下的为右。然后对每个左右递归调用即可。代码如下:
/**
* 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.length==0)
return null;
TreeNode root = new TreeNode(preorder[0]);
if(preorder.length==1)
return root;
int i = 0;//当前根
int j;
for(j = 0;j<inorder.length;j++){//找到根的位置,为了得到左子树长度
if (inorder[j] == preorder[i]) {
break;
}
}
//递归构造左右子树
root.left =
buildTree(Arrays.copyOfRange(preorder, 1, 1+j), Arrays.copyOfRange(inorder, 0, j));
root.right =
buildTree(Arrays.copyOfRange(preorder, 1+j, preorder.length), Arrays.copyOfRange(inorder, j+1, inorder.length));
return root;
}
}
这样就通过了。