题目描述

image.png

解题思路

专题组的二叉树有详细分析🔗

  1. class Solution {
  2. public TreeNode buildTree(int[] preorder, int[] inorder) {
  3. /* Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
  4. Output: [3,9,20,null,null,15,7]*/
  5. return traversal(inorder, 0, inorder.length, preorder, 0, preorder.length);
  6. }
  7. public TreeNode traversal(
  8. int[] inorder, int inLeft, int inRight,
  9. int[] preorder, int preLeft, int preRight
  10. ) {
  11. // 数组大小为0
  12. if (inRight - inLeft == 0) {
  13. return null;
  14. }
  15. // 数组大小只有一个
  16. if (inRight - inLeft == 1) {
  17. return new TreeNode(inorder[inLeft]);
  18. }
  19. int rootValue = preorder[preLeft]; // 获取分割元素
  20. int rootIndex = 0;
  21. // 查找分割元素在中序遍历数组的索引
  22. for (int i = 0; i < inRight; i++) {
  23. if (inorder[i] == rootValue) {
  24. rootIndex = i;
  25. break;
  26. }
  27. }
  28. // 生成此节点
  29. TreeNode root = new TreeNode(rootValue);
  30. // 递归调用
  31. /* Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
  32. Output: [3,9,20,null,null,15,7]*/
  33. // 按照左闭右开分割
  34. root.left = traversal(inorder, inLeft, rootIndex,
  35. preorder, preLeft + 1, preLeft + (rootIndex - inLeft) + 1);
  36. root.right = traversal(inorder, rootIndex + 1, inRight,
  37. preorder, preLeft + (rootIndex - inLeft) + 1, preRight);
  38. return root;
  39. }
  40. }