原题
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 ); |