leetcode-0108 将有序数组转化为二叉搜索树
leetcode-0108 将有序数组转化为二叉搜索树
题目地址 https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
中序遍历(DFS)
首先我们要知道对一棵二分搜索树进行中序遍历得到的结果也是从小到大顺序的,根据题目所给的数组也是从小到大,我们可以很自然的联想到中序遍历。
对于中序遍历DFS来说,我们可以考虑以下几个方面:
子问题:构造树的每个节点以及该节点的左右子树
递归过程
- 选取要构造关系的节点并创建
- 递归构造该节点的左子树
- 递归构造该节点的右子树
递归终止的条件:当递增数组为空时,只能构造一棵空树,此时返回空节点
如果始终选择中间的位置作为根节点,我们可以构造以下解法,改解法的时间复杂度O(n),空间复杂度O(n)这里的O(n)主要是为了存放二分搜索树的空间,递归栈的深度为O(logn)
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return sortedArrayToBST(nums, 0, nums.length - 1);
}
// 递归调用,返回使用nums中以start为起点,以end为终点的子数组,构成的二分搜索树
private TreeNode sortedArrayToBST(int[] nums, int start, int end) {
if (start > end) {
return null;
}
int mid = start + (end - start) / 2;
TreeNode node = new TreeNode(nums[mid]);
node.left = sortedArrayToBST(nums, start, mid - 1);
node.right = sortedArrayToBST(nums, mid + 1, end);
return node;
}
}
更多LeetCode题解和数据结构方面的内容,可以关注我的github,求个star~