原題
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.java
題目大意
給定一個升序排列的二叉樹,將其轉換爲一棵高度平衡的二叉樹。算法
解題思路
採用遞歸分治法。數組
代碼實現
樹結點類函數
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
算法實現類this
public class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
// 參數檢驗
if (nums == null || nums.length < 1) {
return null;
}
// 遞歸分治法求解
return solve(nums, 0, nums.length - 1);
}
/**
* 遞歸分治求解方法
*
* @param nums 升序排序數組
* @param start 開始位置
* @param end 結束位置
* @return 根結點
*/
public TreeNode solve(int[] nums, int start, int end) {
// 還有未處理的數據
if (start <= end) {
// 找蹭位置
int mid = start + ((end - start) >> 1);
// 構造根結點
TreeNode root = new TreeNode(nums[mid]);
// 求左子樹
root.left = solve(nums, start, mid - 1);
// 求右子樹
root.right = solve(nums, mid + 1, end);
// 返回結果
return root;
}
return null;
}
}
題目spa
給一個已排序的數組,將其轉化爲一顆平衡二叉樹。.net
平衡二叉樹要求左右子樹的高度差不超過1。咱們把排序數組的中間節點做爲根,可保證左右子樹的元素個數差不超過1,則確定是平衡二叉樹。這個很好理解,很少解釋了。利用遞歸能夠很容易的解決。使用遞歸的一個要點是,必定要相信咱們的遞歸函數會返回正確的結果,只要處理好返回條件,代碼就很簡單了。code
例如:排序
01 |
Input: Array {1, 2, 3} |
02 |
Output: A Balanced BST |
07 |
Input: Array {1, 2, 3, 4} |
08 |
Output: A Balanced BST |
下面是java的實現:遞歸
01 |
public class SortedArrayToBST { |
03 |
public static Tree SortedArrayToBST( int arr[], int s, int e) { |
07 |
int mid = (s + e) / 2 ; |
09 |
Tree root = new Tree(arr[mid]); |
11 |
root.left = SortedArrayToBST(arr, s, mid - 1 ); |
12 |
root.right = SortedArrayToBST(arr, mid + 1 , e); |
18 |
public Tree left, right; |
26 |
public void inOrder() { |
27 |
if ( this .left != null ) |
29 |
System.out.print(data + " " ); |
30 |
if ( this .right != null ) |
35 |
public void preOrder() { |
36 |
System.out.print(data + " " ); |
37 |
if ( this .left != null ) |
39 |
if ( this .right != null ) |
40 |
this .right.preOrder(); |
44 |
public static void main(String[] args) { |
45 |
int arr[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 }; |
46 |
Tree tree = SortedArrayToBST(arr, 0 , arr.length - 1 ); |