DailyChallenge
108. 将有序数组转换为二叉搜索树
Easy
20200703
Description
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
Solution
中序遍历构造二叉树
/**
* 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. 从前序与中序遍历序列构造二叉树,这道题搞懂了,其他类似的题目也很容易了
105. 从前序与中序遍历序列构造二叉树
Hard
20200703
Description
根据一棵树的前序遍历与中序遍历构造二叉树。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
注意:
你可以假设树中没有重复的元素。
Solution
中序遍历构造二叉树
/**
* 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:动态规划专题