CF1416C XOR Inverse(字典樹+貪心)
阿新 • • 發佈:2021-07-21
105. 從前序與中序遍歷序列構造二叉樹
知識點:二叉樹,遞迴
題目描述
根據一棵樹的中序遍歷與前序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
示例
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
返回如下的二叉樹:
3
/ \
9 20
/ \
15 7
Input: preorder = [-1], inorder = [-1]
Output: [-1]
解法一:遞迴
函式的功能:從一個樹的前序和中序遍歷中還原一顆樹。
1.終止條件:如果前序和中序的陣列為空,返回null;
2.該做什麼:根據前序遍歷的特點能夠知道第一個就是其根節點,然後根據此值可以在中序遍歷中定位出來,然後根據在中序遍歷中的值可以將其分成左右兩個序列,左邊就是其左子樹,右邊就是其右子樹,這樣就得到了左子樹和右子樹的中序遍歷;同理,在前序中第一個元素後跟著的左子樹個數個元素就是左子樹的前序遍歷,再跟著的就是右子樹的前序遍歷,這樣就又能到了前序和中序,遞迴呼叫就可以了。
3.什麼時候做:逐步縮小樹的規模,提供子樹的前序和中序供下層使用:前序;
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { if(preorder == null) return null; Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < inorder.length; i++){ map.put(inorder[i], i); } return buildTree(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1, map); } private TreeNode buildTree(int[] preorder, int[] inorder, int preleft, int preright, int inleft, int inright, Map<Integer, Integer> map){ if(preleft > preright) return null; TreeNode root = new TreeNode(preorder[preleft]); int rootIndex = map.get(root.val); int leftTreeSize = rootIndex-inleft; root.left = buildTree(preorder, inorder, preleft+1, preleft+leftTreeSize, inleft, rootIndex-1, map); root.right = buildTree(preorder, inorder, preleft+leftTreeSize+1, preright, rootIndex+1, inright, map); return root; } }