Easy20200703
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
中序遍历构造二叉树
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode sortedArrayToBST(int[] nums) { int n = nums.length; return inorder(nums, 0, n - 1); } public TreeNode inorder(int[] nums, int left, int right){ if(left > right) return null; int mid = left + (right - left) / 2; TreeNode root = new TreeNode(nums[mid]); root.left = inorder(nums, left, mid - 1); root.right = inorder(nums, mid + 1, right); return root; } }比较简单,推荐做一下105. 从前序与中序遍历序列构造二叉树,这道题搞懂了,其他类似的题目也很容易了
Hard20200703
根据一棵树的前序遍历与中序遍历构造二叉树。
例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7注意:
你可以假设树中没有重复的元素。
中序遍历构造二叉树
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { Map<Integer, Integer> map = new HashMap<>(); int n = inorder.length; for(int i = 0; i < n; i++){ // 通过元素找序号,所以序号是value map.put(inorder[i], i); } return build(preorder, inorder, 0, n - 1, 0, n - 1, map); } public TreeNode build(int[] preorder, int[] inorder, int preLeft, int preRight, int inLeft, int inRight, Map<Integer, Integer> map){ if(preRight < preLeft) return null; TreeNode root = new TreeNode(preorder[preLeft]); int leftLen = map.get(preorder[preLeft]) - inLeft; root.left = build(preorder, inorder, preLeft + 1, preLeft + leftLen, inLeft, inLeft + leftLen, map); root.right = build(preorder, inorder, preLeft + 1 + leftLen, preRight, inLeft + leftLen + 1, inRight, map); return root; } }我的公众号:GitKid
暂时每日分享LeetCode,我在不断学习的过程中,公众号也在不断充实,欢迎大家扫码关注。
TODO:动态规划专题