105. 从前序与中序遍历序列构造二叉树

image.png

递归

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public TreeNode buildTree(int[] preorder, int[] inorder) {
  18. /**
  19. 先序:中左右 中序: 左中右 后续:左右中
  20. 先序遍历第一位为根节点
  21. // 根据 idx 来递归找左右子树
  22. root.left = helper(preorder, preLeft + 1, preLeft + (idx - inLeft),
  23. inorder, inLeft, idx - 1);
  24. root.right = helper(preorder, preLeft + (idx - inLeft) + 1, preRight,
  25. inorder, idx + 1, inRight);
  26. */
  27. return buildTree(preorder,0,preorder.length,
  28. inorder,0,inorder.length);
  29. }
  30. public TreeNode buildTree(int[] preorder,int preL,int preR,
  31. int[] inorder, int inL, int inR ) {
  32. if(inR - inL < 1) return null;
  33. if(inR - inL == 1 ) return new TreeNode(inorder[inL]);
  34. int rootVal = preorder[preL];
  35. //根节点在中序数组中的位置
  36. int rootIndex = inL;
  37. for(int i = inL; i < inR; i++ ) {
  38. if(inorder[i] == rootVal ) {
  39. rootIndex = i;
  40. break;
  41. }
  42. }
  43. TreeNode root = new TreeNode(rootVal);
  44. root.left = buildTree(preorder,preL + 1,preL + (rootIndex - inL),
  45. inorder,inL,rootIndex);
  46. root.right = buildTree(preorder,preL + (rootIndex - inL) + 1, preR,
  47. inorder,rootIndex + 1,inR);
  48. return root;
  49. }
  50. }