[LeetCode]108. 将有序数组转换为二叉搜索树(java实现)
1. 题目
2. 读题(需要重点注意的东西)
- 需要注意的是,要建立的是一颗二叉搜索树,而二叉搜索树的建立,类似于二分查找法;
- 如何建立一棵树:
// 建立根节点
TreeNode root = new TreeNode(nums[mid]);
// 递归建立左子树
root.left = helper(nums,start,mid-1);
// 递归建立右子树
root.right = helper(nums,mid+1,end);
3. 解法
解法:递归
/**
* 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) {
// length 是nums的一个属性,而非函数,因此不使用nums.length()
return helper(nums,0,nums.length-1);
}
private TreeNode helper(int[] nums,int start,int end){
if(start > end) return null;
int mid = (start + end)/2;
TreeNode root = new TreeNode(nums[mid]);
root.left = helper(nums,start,mid-1);
root.right = helper(nums,mid+1,end);
return root;
}
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
二叉搜索树(BST)的性质(主要是类似二分查找的左小右大性质)
递归法
6. 总结
- 二叉搜索树相关问题,最主要的思路是利用二叉搜索树的性质:即左子树的节点都比根节点小,右子树的节点值都比根节点大(因此经过中序遍历就是一个从小到大排列的数组,中序遍历翻转就能得到从大到小排列的数组),这种性质与二分查找的思想也是一致的,因此一颗BST的建立,靠的就是二分查找的思想。
- 同时,要知道如何用代码实现一棵树的建立,即建立根节点
new TreeNode(val)
再递归建立左右子树
root.left = creatTree(root.left);
root.right= creatTree(root.right);