leetcode_【108】将有序数组转换成二叉搜索树

1.题目描述

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定有序数组: [-10,-3,0,5,9],

一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:

1
2
3
4
5
6
>           0
> / \
> -3 9
> / /
> -10 5
>

2.解题思路

将一个排序array转化为平衡二叉搜索树:
平衡二叉树:对于每个根节点,左右子树高度差 <= 1;
二叉搜索树:对于每个节点,其左子树值<此节点值,右子树>此节点值。
要满足以上两个特点,我们自然想到以array中点值作为根节点值,并递归重建,这样就可以同时保证以上两个条件。

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
执行用时 :
3 ms, 在所有 Java 提交中击败了8.50%的用户
内存消耗 :
40.2 MB, 在所有 Java 提交中击败了29.40%的用户
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
if(nums.length == 0)
return null;
//将最中间的数作为根节点
TreeNode root =new TreeNode( nums[nums.length/2]);
//以中间的树为分界,左边归属于左子树,右边归属于右子树
root.left = sortedArrayToBST(Arrays.copyOfRange(nums,0,nums.length/2));
root.right = sortedArrayToBST(Arrays.copyOfRange(nums,nums.length/2+1,nums.length));
return root;
}
}

执行用时为2ms的范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 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) {
// 左右等分建立左右子树,中间节点作为子树根节点,递归该过程
return nums == null ? null : buildTree(nums, 0, nums.length - 1);
}

private TreeNode buildTree(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 = buildTree(nums, left, mid - 1);

root.right = buildTree(nums, mid + 1, right);

return root;
}

}

4.提交记录

leetcode提交结果

文章目录
  1. 1. 1.题目描述
  2. 2. 2.解题思路
  3. 3. 3.代码
  4. 4. 4.提交记录
| 139.6k