一、题目内容

image.png

二、题解

解法1:

思路

二叉树重建 + 二叉树层序遍历变形

代码

  1. public class Solution {
  2. public int[] solve (int[] xianxu, int[] zhongxu) {
  3. // write code here
  4. TreeNode root = rebuild(xianxu,zhongxu);
  5. Queue<TreeNode> queue = new LinkedList<>();
  6. queue.offer(root);
  7. List<Integer> ansList = new ArrayList<>();
  8. while(!queue.isEmpty()){
  9. int size = queue.size();
  10. for(int i = 0;i<size;i++){
  11. TreeNode node = queue.poll();
  12. if(i == size-1){
  13. ansList.add(node.val);
  14. }
  15. if (node.left != null){
  16. queue.offer(node.left);
  17. }
  18. if (node.right != null){
  19. queue.offer(node.right);
  20. }
  21. }
  22. }
  23. int[] res = new int[ansList.size()];
  24. for (int i = 0; i < ansList.size(); i++) {
  25. res[i] = ansList.get(i);
  26. }
  27. return res;
  28. }
  29. private TreeNode rebuild(int[] preorder,int[] inorder){
  30. //递归调用的终止条件
  31. if (preorder.length == 0 || inorder.length == 0) {
  32. return null;
  33. }
  34. TreeNode root = new TreeNode(preorder[0]);
  35. int i;
  36. for(i = 0;i<inorder.length;i++){
  37. if(root.val == inorder[i]){
  38. root.left = rebuild(Arrays.copyOfRange(preorder,1,i+1),Arrays.copyOfRange(inorder,0,i));
  39. root.right = rebuild(Arrays.copyOfRange(preorder,i+1,inorder.length),Arrays.copyOfRange(inorder,i + 1, inorder.length));
  40. break;
  41. }
  42. }
  43. return root;
  44. }
  45. }