题目:

给定两个整数数组preorderinorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点
输入:preorder = [3, 9, 20, 15, 7], inorder = [9, 3, 15, 20, 7]
输出:[3, 9, 20, null, null, 15, 7]

代码:

  1. /**
  2. * @param preorder 前序数组
  3. * @param inorder 中序数组
  4. * @return
  5. */
  6. public TreeNode<Integer> createNewTreeNode(int[] preorder,int[] inorder){
  7. if(preorder.length==0 || inorder.length==0){
  8. return null;
  9. }
  10. TreeNode<Integer> node=new TreeNode<>(preorder[0]);
  11. for(int x=0;x< preorder.length;x++){
  12. if(preorder[0]==inorder[x]){
  13. //前序的特点是根在第一个位置
  14. //中序的特点是根左边是左子树,根右边是右子树
  15. //找出前序中第一个值在中序数组中的位置,确定根,缩小数组范围切割数组.
  16. int index=x;
  17. int[] leftP= Arrays.copyOfRange(preorder,1,index+1);
  18. int[] rightP= Arrays.copyOfRange(preorder,index+1,preorder.length);
  19. int[] leftI= Arrays.copyOfRange(inorder,0,index);
  20. int[] rightI=Arrays.copyOfRange(inorder,index+1,inorder.length);
  21. node.lTreeNode=createNewTreeNode(leftP,leftI);
  22. node.rTreeNode=createNewTreeNode(rightP,rightI);
  23. break;
  24. }
  25. }
  26. return node;
  27. }