题意:
给定一个排好序的整数数组,将它转化为一个平衡的二叉排序树。
初步分析:
二叉排序树的左结点比父节点小,父节点比右结点小。又因为数组是已经排好序了的。所以,数组的中间的值应该是根节点,左边区间的中间值是根节点的左结点,右区间的中间值是根节点的右结点。很明显这是一个动态划分区间的过程,自然想到递归。
递归的三要素:1参数:数组,数组区间的描述(区间左端点,区间右端点)
2一开始的结束条件: 区间左端点 >= 区间右端点
3递归条件的变化:(左右结点)对应(二分区间的左右)(两个递归点)
(递归往左和往右)
进入新的递归之前进行处理:用数组区间中最中间的元素构造并赋值树节点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums, 0, nums.length);
}
public TreeNode sortedArrayToBST(int[] nums, int start, int end) { //结点和区间
if(start >= end)
return null; //递归结束条件
int mid = (start + end)/2;
TreeNode node= new TreeNode(nums[mid]); //对结点的处理,处理完后递归
node.left = sortedArrayToBST(nums, start, mid); //左结点递归
node.right = sortedArrayToBST(nums, mid+1, end); //右结点递归
return node;
}
}