將一個按照升序排列的有序數(shù)組,轉(zhuǎn)換為一棵高度平衡二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節(jié)點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定有序數(shù)組: [-10,-3,0,5,9],
一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:
0
/ \
-3 9
/ /
-10 5
解法
如果要從一個有序數(shù)組中選擇一個元素作為根結(jié)點,應(yīng)該選擇哪個元素呢?我們應(yīng)該選擇有序數(shù)組的中間元素作為根結(jié)點。
選擇了中間元素作為根結(jié)點并創(chuàng)建后,剩下的元素分為兩部分,可以看作是兩個數(shù)組。這樣剩下的元素在根結(jié)點左邊的作為左子樹,右邊的作為右子樹。
我們可以在O(N)的時間內(nèi)從有序數(shù)組創(chuàng)建一棵平衡的BST,使用分治算法,代碼如下:
/**
* 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) {
if (nums.length <= 0) return null;
return sortedArrayToBST(nums, 0, nums.length - 1);
}
private TreeNode sortedArrayToBST(int[] nums, int start, int end) {
if (start > end) return null;
int mid = (start + end + 1) / 2 ;
TreeNode root = new TreeNode(nums[mid]);
root.left = sortedArrayToBST(nums, start, mid - 1);
root.right = sortedArrayToBST(nums, mid + 1, end);
return root;
}
}