题目描述:108.将有序数组转换为二叉搜索树
换个说法提问,同样的方法解题:如何把一个有序的整数数组放到二叉树中
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
解题思路:递归+二分法,创建二叉搜索树
注意:
- 因本题的特性:高度平衡二叉搜索树,注意这个高度平衡,这是能进行二分的关键
- 有序数组—》联想到二叉树的先序遍历—》二叉搜索树
思路:
-
平衡二叉搜索树的特点是:每个节点的左右子树都高度差在1以内,每个节点左子树小于右子树。
-
根据平衡二叉搜索树的特点,可以联想到,每个节点当做根节点的时候,左子树形成的数组一定比它小,右子树形成的数组一定比他大。
因此,符合有序数组任意子数组中点的性质。
-
结合树结构常用的递归思想,可以采用DFS,递归构建这颗树,为了实现每个节点都是平衡二叉搜索树,可以递归二分数组来分配资源,
左面的构建左子树,右面的构建右子树,以此递归。
/**
* 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) {
int len = nums.length;
if(nums.length == 0 || nums == null) {
return null;
} else {
TreeNode p = createSearchTree(nums, 0, len - 1);
return p;
}
}
public TreeNode createSearchTree(int[] num, int start, int end) {
if(start > end) {
return null;
}
int mid = start + (end - start) / 2 ;
//创建根节点
TreeNode p = new TreeNode(num[mid]);
//递归创建根节点的左子树
p.left = createSearchTree(num, start, mid - 1);
//递归创建根节点的右子树
p.right = createSearchTree(num, mid + 1, end);
return p;
}
}
算法性能分析:
由于这种方法值只遍历了一遍数组,因此,算法的时间复杂度为O(n)。其中,n代表的是数组长度。