題目:
將一個按照升序排列的有序數組,轉換爲一棵高度平衡二叉搜索樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定有序數組: [-10,-3,0,5,9],
一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜索樹:
0
/ \
-3 9
/ /
-10 5
代碼:
/**
* @作者:dhc
* @創建時間:18:58 2018/7/31
* @描述:108.將有序數組轉化爲二叉搜索樹
*/
public class OneHundredAndEight {
//思路:首先找出序列中位數,作爲root結點,然後遞歸建立,數組的前半部分返回一個二叉搜索樹
//這個返回的二叉搜索樹的根節點爲當前root的左子樹,同理右子樹
public static TreeNode sortedArrayToBST(int[] nums) {
return getSubNode(nums,0,nums.length - 1);
}
public static TreeNode getSubNode(int[] nums, int l, int r){
//對於只有左結點的結點,它的這個左結點的l==r,因此直接返回(因爲是平衡樹)
if (r == l) {
return new TreeNode(nums[l]);
}
//一開始沒考慮,後來調試,發現對於對於只有左結點的結點,它的l會比r大1,並且最由的那個結點的l==nums.length
//神煩這種條件
if(l > r && r + 1 == l || l == nums.length){
return null;
}
//一開始用(r-l)/2,後來在根結點的右子樹上會出錯,在右子樹這邊還需要加上l,遞歸不好寫
int m = (r + l)/2;
TreeNode root = new TreeNode(nums[m]);
root.left = getSubNode(nums,l,m-1);
root.right = getSubNode(nums, m+1, r);
return root;
}
//中序遍歷驗證結果
public static void midPrint(TreeNode root) {
if(root != null){
midPrint(root.left);
System.out.print(root.val+" ");
midPrint(root.right);
}
}
public static void main(String[] args) {
int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
TreeNode root = sortedArrayToBST(nums);
midPrint(root);
}
}